📑 目錄
- 1. aiva common schemas enhanced Function validate scan id
- 2. aiva common schemas findings Function validate scan id
- 3. aiva common schemas tasks Function validate scan id
- 4. core aiva core execution task queue manager Function get scan progress
- 5. core aiva core ingestion scan module interface Function calculate risk score
- 6. core aiva core ingestion scan module interface Function categorize asset
- 7. core aiva core ingestion scan module interface Function process assets
- 8. core aiva core ingestion scan module interface Function process fingerprints
- 9. core aiva core ingestion scan module interface Module
- 10. core aiva core processing scan result processor Function init
- 11. core aiva core processing scan result processor Module
- 12. core aiva core ui panel dashboard Function create scan task
- 13. function function postex lateral movement Function scan network
- 14. function test schemas Function validate scan id
- 15. integration aiva integration examples enhanced scan integration Function init
- 16. integration aiva integration examples enhanced scan integration Function apply analysis results
- 17. integration aiva integration examples enhanced scan integration Function count by severity
- 18. integration aiva integration examples enhanced scan integration Function finding to dict
- 19. integration aiva integration examples enhanced scan integration Function generate key insights
- 20. integration aiva integration examples enhanced scan integration Function generate summary
- 21. integration aiva integration examples enhanced scan integration Module
- 22. integration aiva integration perf feedback scan metadata analyzer Function calculate performance score
- 23. integration aiva integration perf feedback scan metadata analyzer Function analyze metadata
- 24. integration aiva integration perf feedback scan metadata analyzer Module
- 25. integration aiva integration reporting report content generator Function get scan methodology
- 26. scan init Module
- 27. scan aiva scan init Module
- 28. scan aiva scan authentication manager Function init
- 29. scan aiva scan authentication manager Module
- 30. scan aiva scan config control center Function init
- 31. scan aiva scan config control center Function dataclass to dict
- 32. scan aiva scan config control center Function get aggressive preset
- 33. scan aiva scan config control center Function get balanced preset
- 34. scan aiva scan config control center Function get conservative preset
- 35. scan aiva scan config control center Function get deep preset
- 36. scan aiva scan config control center Function get fast preset
- 37. scan aiva scan config control center Function get stealth preset
- 38. scan aiva scan config control center Function save snapshot
- 39. scan aiva scan config control center Function validate config
- 40. scan aiva scan config control center Function apply preset
- 41. scan aiva scan config control center Function export config
- 42. scan aiva scan config control center Function get config summary
- 43. scan aiva scan config control center Function get config
- 44. scan aiva scan config control center Function get crawling config
- 45. scan aiva scan config control center Function get dynamic config
- 46. scan aiva scan config control center Function get fingerprint config
- 47. scan aiva scan config control center Function get performance config
- 48. scan aiva scan config control center Function get reporting config
- 49. scan aiva scan config control center Function get security config
- 50. scan aiva scan config control center Function reset to defaults
- 51. scan aiva scan config control center Function restore previous config
- 52. scan aiva scan config control center Function update crawling config
- 53. scan aiva scan config control center Function update dynamic config
- 54. scan aiva scan config control center Function update performance config
- 55. scan aiva scan config control center Function update security config
- 56. scan aiva scan config control center Module
- 57. scan aiva scan core crawling engine init Module
- 58. scan aiva scan core crawling engine http client hi Function init
- 59. scan aiva scan core crawling engine http client hi Module
- 60. scan aiva scan core crawling engine static content parser Function extract
- 61. scan aiva scan core crawling engine static content parser Module
- 62. scan aiva scan core crawling engine url queue manager Function init
- 63. scan aiva scan core crawling engine url queue manager Function len
- 64. scan aiva scan core crawling engine url queue manager Function repr
- 65. scan aiva scan core crawling engine url queue manager Function normalize url
- 66. scan aiva scan core crawling engine url queue manager Function add batch
- 67. scan aiva scan core crawling engine url queue manager Function add
- 68. scan aiva scan core crawling engine url queue manager Function clear
- 69. scan aiva scan core crawling engine url queue manager Function get statistics
- 70. scan aiva scan core crawling engine url queue manager Function has next
- 71. scan aiva scan core crawling engine url queue manager Function is processed
- 72. scan aiva scan core crawling engine url queue manager Function is seen
- 73. scan aiva scan core crawling engine url queue manager Function next
- 74. scan aiva scan core crawling engine url queue manager Module
- 75. scan aiva scan dynamic engine init Module
- 76. scan aiva scan dynamic engine ajax api handler Function init
- 77. scan aiva scan dynamic engine ajax api handler Function create api asset
- 78. scan aiva scan dynamic engine ajax api handler Function is valid endpoint
- 79. scan aiva scan dynamic engine ajax api handler Function normalize url
- 80. scan aiva scan dynamic engine ajax api handler Function get discovered endpoints
- 81. scan aiva scan dynamic engine ajax api handler Function get statistics
- 82. scan aiva scan dynamic engine ajax api handler Module
- 83. scan aiva scan dynamic engine dynamic content extractor Function init
- 84. scan aiva scan dynamic engine dynamic content extractor Function clear
- 85. scan aiva scan dynamic engine dynamic content extractor Function convert to assets
- 86. scan aiva scan dynamic engine dynamic content extractor Function get contents by type
- 87. scan aiva scan dynamic engine dynamic content extractor Function get extracted contents
- 88. scan aiva scan dynamic engine dynamic content extractor Function get network requests
- 89. scan aiva scan dynamic engine dynamic content extractor Function get stats
- 90. scan aiva scan dynamic engine dynamic content extractor Module
- 91. scan aiva scan dynamic engine example browser pool Module
- 92. scan aiva scan dynamic engine example extractor Module
- 93. scan aiva scan dynamic engine example usage Module
- 94. scan aiva scan dynamic engine headless browser pool Function init
- 95. scan aiva scan dynamic engine headless browser pool Function get browser info
- 96. scan aiva scan dynamic engine headless browser pool Function get stats
- 97. scan aiva scan dynamic engine headless browser pool Function list browsers
- 98. scan aiva scan dynamic engine headless browser pool Function list pages
- 99. scan aiva scan dynamic engine headless browser pool Module
- 100. scan aiva scan dynamic engine js interaction simulator Function init
- 101. scan aiva scan dynamic engine js interaction simulator Function get events by type
- 102. scan aiva scan dynamic engine js interaction simulator Function add click
- 103. scan aiva scan dynamic engine js interaction simulator Function add event
- 104. scan aiva scan dynamic engine js interaction simulator Function add hover
- 105. scan aiva scan dynamic engine js interaction simulator Function add input
- 106. scan aiva scan dynamic engine js interaction simulator Function add scroll
- 107. scan aiva scan dynamic engine js interaction simulator Function add submit
- 108. scan aiva scan dynamic engine js interaction simulator Function clear queue
- 109. scan aiva scan dynamic engine js interaction simulator Function get results
- 110. scan aiva scan dynamic engine js interaction simulator Function get stats
- 111. scan aiva scan dynamic engine js interaction simulator Function get success rate
- 112. scan aiva scan dynamic engine js interaction simulator Module
- 113. scan aiva scan fingerprint manager Function init
- 114. scan aiva scan fingerprint manager Function get final fingerprints
- 115. scan aiva scan fingerprint manager Function merge
- 116. scan aiva scan fingerprint manager Function reset
- 117. scan aiva scan fingerprint manager Module
- 118. scan aiva scan header configuration Function init
- 119. scan aiva scan header configuration Function get random user agent
- 120. scan aiva scan header configuration Function add header
- 121. scan aiva scan header configuration Function clear custom headers
- 122. scan aiva scan header configuration Function clone
- 123. scan aiva scan header configuration Function create api config
- 124. scan aiva scan header configuration Function create minimal config
- 125. scan aiva scan header configuration Function create stealth config
- 126. scan aiva scan header configuration Function enable user agent rotation
- 127. scan aiva scan header configuration Function from dict
- 128. scan aiva scan header configuration Function get custom headers
- 129. scan aiva scan header configuration Function get default headers
- 130. scan aiva scan header configuration Function get default user agents
- 131. scan aiva scan header configuration Function get headers for api
- 132. scan aiva scan header configuration Function get headers summary
- 133. scan aiva scan header configuration Function get headers
- 134. scan aiva scan header configuration Function get user agent
- 135. scan aiva scan header configuration Function merge headers
- 136. scan aiva scan header configuration Function remove header
- 137. scan aiva scan header configuration Function set authorization
- 138. scan aiva scan header configuration Function set cookie
- 139. scan aiva scan header configuration Function set referer
- 140. scan aiva scan header configuration Function set user agent
- 141. scan aiva scan header configuration Function to dict
- 142. scan aiva scan header configuration Module
- 143. scan aiva scan info gatherer init Module
- 144. scan aiva scan info gatherer javascript source analyzer Function init
- 145. scan aiva scan info gatherer javascript source analyzer Function analyze dataflow
- 146. scan aiva scan info gatherer javascript source analyzer Function build security patterns
- 147. scan aiva scan info gatherer javascript source analyzer Function build sink patterns
- 148. scan aiva scan info gatherer javascript source analyzer Function build source patterns
- 149. scan aiva scan info gatherer javascript source analyzer Function count by type
- 150. scan aiva scan info gatherer javascript source analyzer Function detect patterns
- 151. scan aiva scan info gatherer javascript source analyzer Function detect sinks
- 152. scan aiva scan info gatherer javascript source analyzer Function extract context
- 153. scan aiva scan info gatherer javascript source analyzer Function analyze
- 154. scan aiva scan info gatherer javascript source analyzer Function format report
- 155. scan aiva scan info gatherer javascript source analyzer Function get high risk issues
- 156. scan aiva scan info gatherer javascript source analyzer Function get stats
- 157. scan aiva scan info gatherer javascript source analyzer Module
- 158. scan aiva scan info gatherer passive fingerprinter Function from headers
- 159. scan aiva scan info gatherer passive fingerprinter Module
- 160. scan aiva scan info gatherer sensitive info detector Function init
- 161. scan aiva scan info gatherer sensitive info detector Function post init
- 162. scan aiva scan info gatherer sensitive info detector Function build patterns
- 163. scan aiva scan info gatherer sensitive info detector Function count by location
- 164. scan aiva scan info gatherer sensitive info detector Function count by type
- 165. scan aiva scan info gatherer sensitive info detector Function detect html comments
- 166. scan aiva scan info gatherer sensitive info detector Function detect in text
- 167. scan aiva scan info gatherer sensitive info detector Function detect meta tags
- 168. scan aiva scan info gatherer sensitive info detector Function detect script blocks
- 169. scan aiva scan info gatherer sensitive info detector Function filter by severity
- 170. scan aiva scan info gatherer sensitive info detector Function get default description
- 171. scan aiva scan info gatherer sensitive info detector Function get default recommendation
- 172. scan aiva scan info gatherer sensitive info detector Function detect in headers
- 173. scan aiva scan info gatherer sensitive info detector Function detect in html
- 174. scan aiva scan info gatherer sensitive info detector Function detect in javascript
- 175. scan aiva scan info gatherer sensitive info detector Function detect in response
- 176. scan aiva scan info gatherer sensitive info detector Function format report
- 177. scan aiva scan info gatherer sensitive info detector Function get critical issues
- 178. scan aiva scan info gatherer sensitive info detector Function get high risk issues
- 179. scan aiva scan info gatherer sensitive info detector Function get stats
- 180. scan aiva scan info gatherer sensitive info detector Module
- 181. scan aiva scan javascript analyzer Function init
- 182. scan aiva scan javascript analyzer Function calculate security score
- 183. scan aiva scan javascript analyzer Function detect dangerous functions
- 184. scan aiva scan javascript analyzer Function detect data leaks
- 185. scan aiva scan javascript analyzer Function extract external resources
- 186. scan aiva scan javascript analyzer Function clear results
- 187. scan aiva scan javascript analyzer Function get all results
- 188. scan aiva scan javascript analyzer Function get statistics
- 189. scan aiva scan javascript analyzer Module
- 190. scan aiva scan scan context Function init
- 191. scan aiva scan scan context Function repr
- 192. scan aiva scan scan context Function add asset
- 193. scan aiva scan scan context Function add error
- 194. scan aiva scan scan context Function add forms found
- 195. scan aiva scan scan context Function add js analysis result
- 196. scan aiva scan scan context Function add sensitive match
- 197. scan aiva scan scan context Function get statistics
- 198. scan aiva scan scan context Function increment apis found
- 199. scan aiva scan scan context Function increment pages crawled
- 200. scan aiva scan scan context Function increment urls found
- 201. scan aiva scan scan context Function reset statistics
- 202. scan aiva scan scan context Function scan duration
- 203. scan aiva scan scan context Function set fingerprints
- 204. scan aiva scan scan context Module
- 205. scan aiva scan scan orchestrator Function init
- 206. scan aiva scan scan orchestrator Function build scan result
- 207. scan aiva scan scan orchestrator Function reset
- 208. scan aiva scan scan orchestrator Module
- 209. scan aiva scan schemas Function init
- 210. scan aiva scan schemas Function get default description
- 211. scan aiva scan schemas Function get default recommendation
- 212. scan aiva scan schemas Function limit list size
- 213. scan aiva scan schemas Function limit urls
- 214. scan aiva scan schemas Function validate method
- 215. scan aiva scan schemas Function validate request type
- 216. scan aiva scan schemas Module
- 217. scan aiva scan scope manager Function init
- 218. scan aiva scan scope manager Function compile exclusion patterns
- 219. scan aiva scan scope manager Function compile pattern
- 220. scan aiva scan scope manager Function is host allowed
- 221. scan aiva scan scope manager Function is valid hostname
- 222. scan aiva scan scope manager Function matches exclusion
- 223. scan aiva scan scope manager Function add allowed host
- 224. scan aiva scan scope manager Function add exclusion
- 225. scan aiva scan scope manager Function clone
- 226. scan aiva scan scope manager Function filter urls
- 227. scan aiva scan scope manager Function get allowed hosts
- 228. scan aiva scan scope manager Function get exclusions
- 229. scan aiva scan scope manager Function get scope summary
- 230. scan aiva scan scope manager Function get stats
- 231. scan aiva scan scope manager Function is host allowed
- 232. scan aiva scan scope manager Function is in scope
- 233. scan aiva scan scope manager Function is subdomain included
- 234. scan aiva scan scope manager Function merge with
- 235. scan aiva scan scope manager Function remove allowed host
- 236. scan aiva scan scope manager Function remove exclusion
- 237. scan aiva scan scope manager Function reset stats
- 238. scan aiva scan scope manager Function set include subdomains
- 239. scan aiva scan scope manager Function validate scope
- 240. scan aiva scan scope manager Module
- 241. scan aiva scan sensitive data scanner Function init
- 242. scan aiva scan sensitive data scanner Function determine severity
- 243. scan aiva scan sensitive data scanner Function get context
- 244. scan aiva scan sensitive data scanner Function get severity
- 245. scan aiva scan sensitive data scanner Function mask sensitive value
- 246. scan aiva scan sensitive data scanner Function clear matches
- 247. scan aiva scan sensitive data scanner Function get all matches
- 248. scan aiva scan sensitive data scanner Function get statistics
- 249. scan aiva scan sensitive data scanner Function scan content
- 250. scan aiva scan sensitive data scanner Function scan headers
- 251. scan aiva scan sensitive data scanner Module
- 252. scan aiva scan strategy controller Function init
- 253. scan aiva scan strategy controller Function load strategy parameters
- 254. scan aiva scan strategy controller Function apply to config
- 255. scan aiva scan strategy controller Function clone
- 256. scan aiva scan strategy controller Function compare with
- 257. scan aiva scan strategy controller Function customize
- 258. scan aiva scan strategy controller Function estimate scan time
- 259. scan aiva scan strategy controller Function get available strategies
- 260. scan aiva scan strategy controller Function get concurrent requests
- 261. scan aiva scan strategy controller Function get max depth
- 262. scan aiva scan strategy controller Function get max pages
- 263. scan aiva scan strategy controller Function get parameters
- 264. scan aiva scan strategy controller Function get recommended strategy for target
- 265. scan aiva scan strategy controller Function get requests per second
- 266. scan aiva scan strategy controller Function get strategy description
- 267. scan aiva scan strategy controller Function get strategy name
- 268. scan aiva scan strategy controller Function get strategy summary
- 269. scan aiva scan strategy controller Function is aggressive
- 270. scan aiva scan strategy controller Function is dynamic scan enabled
- 271. scan aiva scan strategy controller Function is stealth
- 272. scan aiva scan strategy controller Function reset customizations
- 273. scan aiva scan strategy controller Module
- 274. scan aiva scan worker Module
- 275. scan aiva scan worker refactored Module
- 276. scan discovery schemas Function validate finding id
- 277. scan discovery schemas Function validate scan id
- 278. scan discovery schemas Function validate strategy
- 279. scan discovery schemas Function validate targets
- 280. scan discovery schemas Module
- 281. scan models Function validate scan id
- 282. scan models Function validate strategy
- 283. scan models Function validate targets
- 284. scan models Module
- 285. scan context Function init
- 286. scan context Function repr
- 287. scan context Function add asset
- 288. scan context Function add error
- 289. scan context Function add forms found
- 290. scan context Function add js analysis result
- 291. scan context Function add sensitive match
- 292. scan context Function get statistics
- 293. scan context Function increment apis found
- 294. scan context Function increment pages crawled
- 295. scan context Function increment urls found
- 296. scan context Function reset statistics
- 297. scan context Function scan duration
- 298. scan context Function set fingerprints
- 299. scan context Module
- 300. scan orchestrator Function init
- 301. scan orchestrator Function build scan result
- 302. scan orchestrator Function reset
- 303. scan orchestrator Module
- 304. sensitive data scanner Function init
- 305. sensitive data scanner Function determine severity
- 306. sensitive data scanner Function get context
- 307. sensitive data scanner Function get severity
- 308. sensitive data scanner Function mask sensitive value
- 309. sensitive data scanner Function clear matches
- 310. sensitive data scanner Function get all matches
- 311. sensitive data scanner Function get statistics
- 312. sensitive data scanner Function scan content
- 313. sensitive data scanner Function scan headers
- 314. sensitive data scanner Module
- 315. strategy controller Function estimate scan time
- 316. strategy controller Function is dynamic scan enabled
1. aiva common schemas enhanced Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
2. aiva common schemas findings Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith("scan_'&...}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith("scan_'&...}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
3. aiva common schemas tasks Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
4. core aiva core execution task queue manager Function get scan progress
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取掃描進度\n\n Args:\n ...]
n4[stats = self._scan_stats[sca...]
n5[total = stats['total']]
n6[completed = stats['completed'...]
n7[failed = stats['failed']]
n8[return {'scan_id': scan_id, ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取掃描進度\n\n Args:\n ...]
n4[stats = self._scan_stats[sca...]
n5[total = stats['total']]
n6[completed = stats['completed'...]
n7[failed = stats['failed']]
n8[return {'scan_id': scan_id, ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
5. core aiva core ingestion scan module interface Function calculate risk score
flowchart TB
n1([開始])
n2([結束])
n3['\n 計算資產風險分數\n\n Args:\n ...]
n4[risk_score = 1]
n5{if asset.type == 'URL'}
n6{if asset.has_form}
n7[risk_score += 3]
n8[]
n9{if asset.parameters}
n10[risk_score += len(asset.parameters)]
n11[]
n12{if asset.type == 'API'}
n13[risk_score += 2]
n14[]
n15[]
n16[return min(risk_score, 10)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n15
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 計算資產風險分數\n\n Args:\n ...]
n4[risk_score = 1]
n5{if asset.type == 'URL'}
n6{if asset.has_form}
n7[risk_score += 3]
n8[]
n9{if asset.parameters}
n10[risk_score += len(asset.parameters)]
n11[]
n12{if asset.type == 'API'}
n13[risk_score += 2]
n14[]
n15[]
n16[return min(risk_score, 10)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n15
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
6. core aiva core ingestion scan module interface Function categorize asset
flowchart TB
n1([開始])
n2([結束])
n3['\n 資產分類\n\n Args:\n ...]
n4[categories: list[str] = []]
n5{if not hasattr(asset, 'value'...}
n6[return categories]
n7[]
n8[url_path = str(asset.value).low...]
n9{if any((keyword in url_path fo...}
n10[categories.append('authentication&...]
n11[]
n12{if any((keyword in url_path fo...}
n13[categories.append('administration&...]
n14[]
n15{if any((keyword in url_path fo...}
n16[categories.append('api')]
n17[]
n18{if any((keyword in url_path fo...}
n19[categories.append('file_handling&#...]
n20[]
n21{if any((keyword in url_path fo...}
n22[categories.append('search')]
n23[]
n24{if asset.has_form}
n25[categories.append('form_input'...]
n26[]
n27{if asset.parameters}
n28[categories.append('parameterized&#...]
n29[]
n30[return categories]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n20
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n23
n22 --> n23
n23 --> n24
n24 -->|Yes| n25
n24 -->|No| n26
n25 --> n26
n26 --> n27
n27 -->|Yes| n28
n27 -->|No| n29
n28 --> n29
n29 --> n30
n30 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 資產分類\n\n Args:\n ...]
n4[categories: list[str] = []]
n5{if not hasattr(asset, 'value'...}
n6[return categories]
n7[]
n8[url_path = str(asset.value).low...]
n9{if any((keyword in url_path fo...}
n10[categories.append('authentication&...]
n11[]
n12{if any((keyword in url_path fo...}
n13[categories.append('administration&...]
n14[]
n15{if any((keyword in url_path fo...}
n16[categories.append('api')]
n17[]
n18{if any((keyword in url_path fo...}
n19[categories.append('file_handling&#...]
n20[]
n21{if any((keyword in url_path fo...}
n22[categories.append('search')]
n23[]
n24{if asset.has_form}
n25[categories.append('form_input&#39...]
n26[]
n27{if asset.parameters}
n28[categories.append('parameterized&#...]
n29[]
n30[return categories]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n20
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n23
n22 --> n23
n23 --> n24
n24 -->|Yes| n25
n24 -->|No| n26
n25 --> n26
n26 --> n27
n27 -->|Yes| n28
n27 -->|No| n29
n28 --> n29
n29 --> n30
n30 --> n2
7. core aiva core ingestion scan module interface Function process assets
flowchart TB
n1([開始])
n2([結束])
n3['\n 處理資產清單,進行分類與標準化\n\n Args:\n...]
n4[processed_assets = []]
n5{for asset in assets}
n6[processed_asset = {'asset_id'...]
n7[processed_assets.append(processed_asset)]
n8[]
n9[return processed_assets]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 處理資產清單,進行分類與標準化\n\n Args:\n...]
n4[processed_assets = []]
n5{for asset in assets}
n6[processed_asset = {'asset_id&#39...]
n7[processed_assets.append(processed_asset)]
n8[]
n9[return processed_assets]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
8. core aiva core ingestion scan module interface Function process fingerprints
flowchart TB
n1([開始])
n2([結束])
n3['\n 處理技術指紋資料\n\n Args:\n ...]
n4{if not fingerprints}
n5[return {}]
n6[]
n7[return {'web_server': finger...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 處理技術指紋資料\n\n Args:\n ...]
n4{if not fingerprints}
n5[return {}]
n6[]
n7[return {'web_server': finger...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
9. core aiva core ingestion scan module interface Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from typing import Any]
n5[from services.aiva_common.schemas import ScanCompl...]
n6[class ScanModuleInterface(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from typing import Any]
n5[from services.aiva_common.schemas import ScanCompl...]
n6[class ScanModuleInterface(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
10. core aiva core processing scan result processor Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化處理器\n\n Args:\n ...]
n4[self.scan_interface = scan_interface]
n5[self.surface_analyzer = surface_analyzer]
n6[self.strategy_adjuster = strategy_adjuster]
n7[self.task_generator = task_generator]
n8[self.task_queue_manager = task_queue_manager]
n9[self.session_state_manager = session_state_manage...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化處理器\n\n Args:\n ...]
n4[self.scan_interface = scan_interface]
n5[self.surface_analyzer = surface_analyzer]
n6[self.strategy_adjuster = strategy_adjuster]
n7[self.task_generator = task_generator]
n8[self.task_queue_manager = task_queue_manager]
n9[self.session_state_manager = session_state_manage...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
11. core aiva core processing scan result processor Module
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描結果處理器 - 七階段處理流程\n\n此模組封裝了核心引擎處理掃描結果的完整七階...]
n4[from __future__ import annotations]
n5[import json]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import ScanCompl...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[from services.aiva_common.mq import Broker]
n11[from services.core.aiva_core.analysis.dynamic_stra...]
n12[from services.core.aiva_core.analysis.initial_surf...]
n13[from services.core.aiva_core.execution.task_genera...]
n14[from services.core.aiva_core.execution.task_queue_...]
n15[from services.core.aiva_core.ingestion.scan_module...]
n16[from services.core.aiva_core.state.session_state_m...]
n17[]
n18[logger = get_logger(__name__)]
n19[class ScanResultProcessor(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n17
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描結果處理器 - 七階段處理流程\n\n此模組封裝了核心引擎處理掃描結果的完整七階...]
n4[from __future__ import annotations]
n5[import json]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import ScanCompl...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[from services.aiva_common.mq import Broker]
n11[from services.core.aiva_core.analysis.dynamic_stra...]
n12[from services.core.aiva_core.analysis.initial_surf...]
n13[from services.core.aiva_core.execution.task_genera...]
n14[from services.core.aiva_core.execution.task_queue_...]
n15[from services.core.aiva_core.ingestion.scan_module...]
n16[from services.core.aiva_core.state.session_state_m...]
n17[]
n18[logger = get_logger(__name__)]
n19[class ScanResultProcessor(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n17
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
12. core aiva core ui panel dashboard Function create scan task
flowchart TB
n1([開始])
n2([結束])
n3['建立掃描任務.\n\n Args:\n target...]
n4{if use_ai is None}
n5[use_ai = self.mode in ('ai', ...]
n6[]
n7[task_id = f'scan_{hash(target_...]
n8{if use_ai and self.ai_agent}
n9[logger.info('\n[AI] 使用 AI 代理建立掃描任...]
n10[result = self.ai_agent.invoke...]
n11[task = {'task_id': task_id,...]
n12[logger.info('\n[UI] 使用 UI 模式建立掃描任...]
n13[task = {'task_id': task_id,...]
n14[]
n15[self.scan_tasks.append(task)]
n16[logger.info(f'掃描任務已建立: {task_id}...]
n17[return task]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n12
n9 --> n10
n10 --> n11
n11 --> n14
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['建立掃描任務.\n\n Args:\n target...]
n4{if use_ai is None}
n5[use_ai = self.mode in ('ai', ...]
n6[]
n7[task_id = f'scan_{hash(target_...]
n8{if use_ai and self.ai_agent}
n9[logger.info('\n[AI] 使用 AI 代理建立掃描任...]
n10[result = self.ai_agent.invoke...]
n11[task = {'task_id': task_id,...]
n12[logger.info('\n[UI] 使用 UI 模式建立掃描任...]
n13[task = {'task_id': task_id,...]
n14[]
n15[self.scan_tasks.append(task)]
n16[logger.info(f'掃描任務已建立: {task_id}...]
n17[return task]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n12
n9 --> n10
n10 --> n11
n11 --> n14
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
13. function function postex lateral movement Function scan network
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描網絡中的活躍主機\n\n Args:\n ...]
n4[target = network or self.targ...]
n5[self._log_action('scan_network...]
n6[result = {'test_name': &...]
n7{if self.safe_mode}
n8[result['mode'] = &...]
n9[result['hosts'].append...]
n10[result['mode'] = &...]
n11[result['error'] = &...]
n12[]
n13[self.test_results.append(result)]
n14[logger.info('network_scan_completed&&...]
n15[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n10
n8 --> n9
n9 --> n12
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描網絡中的活躍主機\n\n Args:\n ...]
n4[target = network or self.targ...]
n5[self._log_action('scan_network&#3...]
n6[result = {'test_name': &...]
n7{if self.safe_mode}
n8[result['mode'] = &...]
n9[result['hosts'].append...]
n10[result['mode'] = &...]
n11[result['error'] = &&#...]
n12[]
n13[self.test_results.append(result)]
n14[logger.info('network_scan_completed&&...]
n15[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n10
n8 --> n9
n9 --> n12
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
14. function test schemas Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
15. integration aiva integration examples enhanced scan integration Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化處理器\n\n Args:\n ...]
n4[self.engine = create_engine(databa...]
n5[self.SessionLocal = sessionmaker(bind=se...]
n6[Base.metadata.create_all(bind=self.engine)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化處理器\n\n Args:\n ...]
n4[self.engine = create_engine(databa...]
n5[self.SessionLocal = sessionmaker(bind=se...]
n6[Base.metadata.create_all(bind=self.engine)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
16. integration aiva integration examples enhanced scan integration Function apply analysis results
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據分析結果應用標籤和更新狀態\n\n Args:\n...]
n4{if correlation_result.get('att...}
n5{for chain in correlation_resul...}
n6{for step in chain.get('matche...}
n7{for finding in step.get('finding...}
n8[vuln_id = finding.get('finding...]
n9{if vuln_id}
n10[manager.add_vulnerability_tag(vuln_id, 'a...]
n11[manager.add_vulnerability_tag(vuln_id, f"cha...]
n12[]
n13[]
n14[]
n15[]
n16[]
n17{if root_cause_result.get('root...}
n18{for root_cause in root_cause_result...}
n19{for vuln_id in root_cause.get('v...}
n20[manager.add_vulnerability_tag(vuln_id, 'r...]
n21[manager.add_vulnerability_tag(vuln_id, f"com...]
n22[]
n23[]
n24[]
n25{if sast_dast_result.get('confi...}
n26{for flow in sast_dast_result[...}
n27[sast_id = flow.get('sast_findi...]
n28[dast_id = flow.get('dast_findi...]
n29{if sast_id}
n30[manager.add_vulnerability_tag(sast_id, 's...]
n31[manager.add_vulnerability_tag(sast_id, 'h...]
n32[]
n33{if dast_id}
n34[manager.add_vulnerability_tag(dast_id, 's...]
n35[manager.add_vulnerability_tag(dast_id, 'h...]
n36[]
n37[]
n38[]
n39{if sast_dast_result.get('uncon...}
n40{for unconfirmed in sast_dast_result[...}
n41[vuln_id = unconfirmed.get('fin...]
n42{if vuln_id}
n43[manager.add_vulnerability_tag(vuln_id, 's...]
n44[manager.add_vulnerability_tag(vuln_id, 'n...]
n45[]
n46[]
n47[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n16
n5 -->|Yes| n6
n5 -->|No| n15
n6 -->|Yes| n7
n6 -->|No| n14
n7 -->|Yes| n8
n7 -->|No| n13
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n12
n10 --> n11
n11 --> n12
n12 --> n7
n13 --> n6
n14 --> n5
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n24
n18 -->|Yes| n19
n18 -->|No| n23
n19 -->|Yes| n20
n19 -->|No| n22
n20 --> n21
n21 --> n19
n22 --> n18
n23 --> n24
n24 --> n25
n25 -->|Yes| n26
n25 -->|No| n38
n26 -->|Yes| n27
n26 -->|No| n37
n27 --> n28
n28 --> n29
n29 -->|Yes| n30
n29 -->|No| n32
n30 --> n31
n31 --> n32
n32 --> n33
n33 -->|Yes| n34
n33 -->|No| n36
n34 --> n35
n35 --> n36
n36 --> n26
n37 --> n38
n38 --> n39
n39 -->|Yes| n40
n39 -->|No| n47
n40 -->|Yes| n41
n40 -->|No| n46
n41 --> n42
n42 -->|Yes| n43
n42 -->|No| n45
n43 --> n44
n44 --> n45
n45 --> n40
n46 --> n47
n47 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據分析結果應用標籤和更新狀態\n\n Args:\n...]
n4{if correlation_result.get('att...}
n5{for chain in correlation_resul...}
n6{for step in chain.get('matche...}
n7{for finding in step.get('finding...}
n8[vuln_id = finding.get('finding...]
n9{if vuln_id}
n10[manager.add_vulnerability_tag(vuln_id, 'a...]
n11[manager.add_vulnerability_tag(vuln_id, f"cha...]
n12[]
n13[]
n14[]
n15[]
n16[]
n17{if root_cause_result.get('root...}
n18{for root_cause in root_cause_result...}
n19{for vuln_id in root_cause.get('v...}
n20[manager.add_vulnerability_tag(vuln_id, 'r...]
n21[manager.add_vulnerability_tag(vuln_id, f"com...]
n22[]
n23[]
n24[]
n25{if sast_dast_result.get('confi...}
n26{for flow in sast_dast_result[...}
n27[sast_id = flow.get('sast_findi...]
n28[dast_id = flow.get('dast_findi...]
n29{if sast_id}
n30[manager.add_vulnerability_tag(sast_id, 's...]
n31[manager.add_vulnerability_tag(sast_id, 'h...]
n32[]
n33{if dast_id}
n34[manager.add_vulnerability_tag(dast_id, 's...]
n35[manager.add_vulnerability_tag(dast_id, 'h...]
n36[]
n37[]
n38[]
n39{if sast_dast_result.get('uncon...}
n40{for unconfirmed in sast_dast_result[...}
n41[vuln_id = unconfirmed.get('fin...]
n42{if vuln_id}
n43[manager.add_vulnerability_tag(vuln_id, 's...]
n44[manager.add_vulnerability_tag(vuln_id, 'n...]
n45[]
n46[]
n47[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n16
n5 -->|Yes| n6
n5 -->|No| n15
n6 -->|Yes| n7
n6 -->|No| n14
n7 -->|Yes| n8
n7 -->|No| n13
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n12
n10 --> n11
n11 --> n12
n12 --> n7
n13 --> n6
n14 --> n5
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n24
n18 -->|Yes| n19
n18 -->|No| n23
n19 -->|Yes| n20
n19 -->|No| n22
n20 --> n21
n21 --> n19
n22 --> n18
n23 --> n24
n24 --> n25
n25 -->|Yes| n26
n25 -->|No| n38
n26 -->|Yes| n27
n26 -->|No| n37
n27 --> n28
n28 --> n29
n29 -->|Yes| n30
n29 -->|No| n32
n30 --> n31
n31 --> n32
n32 --> n33
n33 -->|Yes| n34
n33 -->|No| n36
n34 --> n35
n35 --> n36
n36 --> n26
n37 --> n38
n38 --> n39
n39 -->|Yes| n40
n39 -->|No| n47
n40 -->|Yes| n41
n40 -->|No| n46
n41 --> n42
n42 -->|Yes| n43
n42 -->|No| n45
n43 --> n44
n44 --> n45
n45 --> n40
n46 --> n47
n47 --> n2
17. integration aiva integration examples enhanced scan integration Function count by severity
flowchart TB
n1([開始])
n2([結束])
n3['統計漏洞嚴重程度分布']
n4[counts = {'CRITICAL': 0, &am...]
n5{for vuln in vulnerabilities}
n6[severity = vuln.severity.upper(...]
n7{if severity in counts}
n8[counts[severity] += 1]
n9[]
n10[]
n11[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['統計漏洞嚴重程度分布']
n4[counts = {'CRITICAL': 0, &am...]
n5{for vuln in vulnerabilities}
n6[severity = vuln.severity.upper(...]
n7{if severity in counts}
n8[counts[severity] += 1]
n9[]
n10[]
n11[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
18. integration aiva integration examples enhanced scan integration Function finding to dict
flowchart TB
n1([開始])
n2([結束])
n3['轉換 FindingPayload 為字典']
n4[return {'finding_id': findin...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['轉換 FindingPayload 為字典']
n4[return {'finding_id': findin...]
n1 --> n3
n3 --> n4
n4 --> n2
19. integration aiva integration examples enhanced scan integration Function generate key insights
flowchart TB
n1([開始])
n2([結束])
n3['生成關鍵洞察']
n4[insights = []]
n5{if correlation_result.get('att...}
n6[chain_count = len(correlation_resu...]
n7[insights.append(f'🔗 識別出 {chain_count...]
n8[]
n9{if root_cause_result.get('root...}
n10[root_count = len(root_cause_resul...]
n11[affected = len(root_cause_resul...]
n12[insights.append(f'🎯 發現 {root_count...]
n13[]
n14{if sast_dast_result.get('confi...}
n15[confirmed = len(sast_dast_result...]
n16[rate = sast_dast_result.get...]
n17[insights.append(f'✅ {confirmed}...]
n18[]
n19[risk_amp = correlation_result.g...]
n20{if risk_amp > 1.5}
n21[insights.append(f'⚠️ 漏洞相關性導致風險放大 {ri...]
n22[]
n23[return insights]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n13
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n18
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['生成關鍵洞察']
n4[insights = []]
n5{if correlation_result.get('att...}
n6[chain_count = len(correlation_resu...]
n7[insights.append(f'🔗 識別出 {chain_count...]
n8[]
n9{if root_cause_result.get('root...}
n10[root_count = len(root_cause_resul...]
n11[affected = len(root_cause_resul...]
n12[insights.append(f'🎯 發現 {root_count&#...]
n13[]
n14{if sast_dast_result.get('confi...}
n15[confirmed = len(sast_dast_result...]
n16[rate = sast_dast_result.get...]
n17[insights.append(f'✅ {confirmed}...]
n18[]
n19[risk_amp = correlation_result.g...]
n20{if risk_amp > 1.5}
n21[insights.append(f'⚠️ 漏洞相關性導致風險放大 {ri...]
n22[]
n23[return insights]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n13
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n18
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n2
20. integration aiva integration examples enhanced scan integration Function generate summary
flowchart TB
n1([開始])
n2([結束])
n3['生成處理摘要']
n4[return {'asset': {&...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['生成處理摘要']
n4[return {'asset': {&...]
n1 --> n3
n3 --> n4
n4 --> n2
21. integration aiva integration examples enhanced scan integration Module
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA 增強功能整合示例\n\n展示如何在實際掃描流程中使用新的資產與漏洞生命週期...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from typing import Any]
n7[from sqlalchemy import create_engine]
n8[from sqlalchemy.orm import sessionmaker]
n9[from services.aiva_common.schemas import FindingPa...]
n10[from services.aiva_common.utils import get_logger]
n11[from services.integration.aiva_integration.analysi...]
n12[from services.integration.aiva_integration.recepti...]
n13[from services.integration.aiva_integration.recepti...]
n14[logger = get_logger(__name__)]
n15[class EnhancedScanProcessor(...)]
n16[def example_scan_workflow(...)]
n17[def example_vulnerability_management(...)]
n18{if __name__ == '__main__'}
n19[asyncio.run(example_scan_workflow())]
n20[asyncio.run(example_vulnerability_management()...]
n21[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n21
n19 --> n20
n20 --> n21
n21 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA 增強功能整合示例\n\n展示如何在實際掃描流程中使用新的資產與漏洞生命週期...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from typing import Any]
n7[from sqlalchemy import create_engine]
n8[from sqlalchemy.orm import sessionmaker]
n9[from services.aiva_common.schemas import FindingPa...]
n10[from services.aiva_common.utils import get_logger]
n11[from services.integration.aiva_integration.analysi...]
n12[from services.integration.aiva_integration.recepti...]
n13[from services.integration.aiva_integration.recepti...]
n14[logger = get_logger(__name__)]
n15[class EnhancedScanProcessor(...)]
n16[def example_scan_workflow(...)]
n17[def example_vulnerability_management(...)]
n18{if __name__ == '__main__'}
n19[asyncio.run(example_scan_workflow())]
n20[asyncio.run(example_vulnerability_management()...]
n21[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n21
n19 --> n20
n20 --> n21
n21 --> n2
22. integration aiva integration perf feedback scan metadata analyzer Function calculate performance score
flowchart TB
n1([開始])
n2([結束])
n3['計算性能分數']
n4[duration = scan_data.get('durat...]
n5[targets = scan_data.get('targe...]
n6{if duration == 0 or targets == 0}
n7[return 0.0]
n8[]
n9[score = targets / max(durati...]
n10[return min(score, 100.0)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['計算性能分數']
n4[duration = scan_data.get('durat...]
n5[targets = scan_data.get('targe...]
n6{if duration == 0 or targets == 0}
n7[return 0.0]
n8[]
n9[score = targets / max(durati...]
n10[return min(score, 100.0)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
23. integration aiva integration perf feedback scan metadata analyzer Function analyze metadata
flowchart TB
n1([開始])
n2([結束])
n3['分析掃描元數據']
n4[return {'scan_duration': sca...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['分析掃描元數據']
n4[return {'scan_duration': sca...]
n1 --> n3
n3 --> n4
n4 --> n2
24. integration aiva integration perf feedback scan metadata analyzer Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from datetime import UTC, datetime]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class ScanMetadataAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from datetime import UTC, datetime]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class ScanMetadataAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
25. integration aiva integration reporting report content generator Function get scan methodology
flowchart TB
n1([開始])
n2([結束])
n3['獲取掃描方法說明']
n4[return '本次安全評估使用 AIVA 自動化漏洞評估平台進行,結合靜...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['獲取掃描方法說明']
n4[return '本次安全評估使用 AIVA 自動化漏洞評估平台進行,結合靜...]
n1 --> n3
n3 --> n4
n4 --> n2
26. scan init Module
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA Scan - 掃描模組\n\n這是 AIVA 的掃描模組包,負責目標發現、...]
n4[__version__ = '1.0.0']
n5[from ..aiva_common.enums import AssetType, ScanSta...]
n6[from ..aiva_common.schemas import CVEReference, CV...]
n7[from .models import Asset, AssetInventoryItem, Ass...]
n8[__all__ = ['AssetType', &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA Scan - 掃描模組\n\n這是 AIVA 的掃描模組包,負責目標發現、...]
n4[__version__ = '1.0.0']
n5[from ..aiva_common.enums import AssetType, ScanSta...]
n6[from ..aiva_common.schemas import CVEReference, CV...]
n7[from .models import Asset, AssetInventoryItem, Ass...]
n8[__all__ = ['AssetType', &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
27. scan aiva scan init Module
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
28. scan aiva scan authentication manager Function init
flowchart TB
n1([開始])
n2([結束])
n3[self.auth = auth]
n1 --> n3
n3 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[self.auth = auth]
n1 --> n3
n3 --> n2
29. scan aiva scan authentication manager Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from services.aiva_common.schemas import Authentic...]
n5[class AuthenticationManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from services.aiva_common.schemas import Authentic...]
n5[class AuthenticationManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
30. scan aiva scan config control center Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化配置控制中心\n\n Args:\n ...]
n4[self._config = config or ScanModule...]
n5[self._config_history: list[ScanModuleConfig] = ...]
n6[self._validate_config()]
n7[logger.info('ConfigControlCenter initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化配置控制中心\n\n Args:\n ...]
n4[self._config = config or ScanModule...]
n5[self._config_history: list[ScanModuleConfig] = &#...]
n6[self._validate_config()]
n7[logger.info('ConfigControlCenter initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
31. scan aiva scan config control center Function dataclass to dict
flowchart TB
n1([開始])
n2([結束])
n3['將 dataclass 轉換為字典']
n4{if not hasattr(obj, '__datacla...}
n5[return obj]
n6[]
n7[result = {}]
n8{for field_name in obj.__dataclass_f...}
n9[value = getattr(obj, field_n...]
n10{if hasattr(value, '__dataclass...}
n11[result[field_name] = self._dataclass_to_d...]
n12[result[field_name] = value]
n13[]
n14[]
n15[return result]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n14
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n8
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['將 dataclass 轉換為字典']
n4{if not hasattr(obj, '__datacla...}
n5[return obj]
n6[]
n7[result = {}]
n8{for field_name in obj.__dataclass_f...}
n9[value = getattr(obj, field_n...]
n10{if hasattr(value, '__dataclass...}
n11[result[field_name] = self._dataclass_to_d...]
n12[result[field_name] = value]
n13[]
n14[]
n15[return result]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n14
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n8
n14 --> n15
n15 --> n2
32. scan aiva scan config control center Function get aggressive preset
flowchart TB
n1([開始])
n2([結束])
n3['激進模式:深度、全面、高負載']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['激進模式:深度、全面、高負載']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
33. scan aiva scan config control center Function get balanced preset
flowchart TB
n1([開始])
n2([結束])
n3['平衡模式:默認配置']
n4[return ScanModuleConfig()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['平衡模式:默認配置']
n4[return ScanModuleConfig()]
n1 --> n3
n3 --> n4
n4 --> n2
34. scan aiva scan config control center Function get conservative preset
flowchart TB
n1([開始])
n2([結束])
n3['保守模式:快速、安全、低負載']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['保守模式:快速、安全、低負載']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
35. scan aiva scan config control center Function get deep preset
flowchart TB
n1([開始])
n2([結束])
n3['深度模式:深度爬取、全面覆蓋']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['深度模式:深度爬取、全面覆蓋']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
36. scan aiva scan config control center Function get fast preset
flowchart TB
n1([開始])
n2([結束])
n3['快速模式:高速、淺掃描']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['快速模式:高速、淺掃描']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
37. scan aiva scan config control center Function get stealth preset
flowchart TB
n1([開始])
n2([結束])
n3['隱秘模式:低速、避免檢測']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['隱秘模式:低速、避免檢測']
n4[return ScanModuleConfig(crawling=Craw...]
n1 --> n3
n3 --> n4
n4 --> n2
38. scan aiva scan config control center Function save snapshot
flowchart TB
n1([開始])
n2([結束])
n3['保存當前配置快照']
n4[import copy]
n5[snapshot = copy.deepcopy(self._...]
n6[self._config_history.append(snapshot)]
n7{if len(self._config_history) > 10}
n8[self._config_history.pop(0)]
n9[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3['保存當前配置快照']
n4[import copy]
n5[snapshot = copy.deepcopy(self._...]
n6[self._config_history.append(snapshot)]
n7{if len(self._config_history) > 10}
n8[self._config_history.pop(0)]
n9[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
39. scan aiva scan config control center Function validate config
flowchart TB
n1([開始])
n2([結束])
n3['驗證配置有效性']
n4[crawl = self._config.crawlin...]
n5[perf = self._config.perform...]
n6{if crawl.max_depth < 1}
n7[logger.warning('max_depth < 1, set...]
n8[crawl.max_depth = 1]
n9[]
n10{if crawl.max_pages < 1}
n11[logger.warning('max_pages < 1, set...]
n12[crawl.max_pages = 1]
n13[]
n14{if perf.max_concurrent_scans < 1}
n15[logger.warning('max_concurrent_scans &...]
n16[perf.max_concurrent_scans = 1]
n17[]
n18{if self._config.dynamic.enable...}
n19[logger.warning('Dynamic scan enabled but ...]
n20[self._config.dynamic.browser_pool_size = 1]
n21[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n13
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n17
n15 --> n16
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n21
n19 --> n20
n20 --> n21
n21 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;驗證配置有效性&#39;]
n4[crawl = self._config.crawlin...]
n5[perf = self._config.perform...]
n6{if crawl.max_depth &lt; 1}
n7[logger.warning(&#39;max_depth &lt; 1, set...]
n8[crawl.max_depth = 1]
n9[]
n10{if crawl.max_pages &lt; 1}
n11[logger.warning(&#39;max_pages &lt; 1, set...]
n12[crawl.max_pages = 1]
n13[]
n14{if perf.max_concurrent_scans &lt; 1}
n15[logger.warning(&#39;max_concurrent_scans &...]
n16[perf.max_concurrent_scans = 1]
n17[]
n18{if self._config.dynamic.enable...}
n19[logger.warning(&#39;Dynamic scan enabled but ...]
n20[self._config.dynamic.browser_pool_size = 1]
n21[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n13
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n17
n15 --> n16
n16 --> n17
n17 --> n18
n18 -->|Yes| n19
n18 -->|No| n21
n19 --> n20
n20 --> n21
n21 --> n2
40. scan aiva scan config control center Function apply preset
flowchart TB
n1([開始])
n2([結束])
n3['\n 應用預設配置模板\n\n Args:\n ...]
n4[self._save_snapshot()]
n5[presets = {'conservative': s...]
n6{if preset_name not in presets}
n7[logger.warning(f'Unknown preset: {pr...]
n8[return False]
n9[]
n10[preset_config = presets[preset_name]...]
n11[self._config = preset_config]
n12[self._validate_config()]
n13[logger.info(f'Applied preset: {prese...]
n14[return True]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 應用預設配置模板\n\n Args:\n ...]
n4[self._save_snapshot()]
n5[presets = {&#39;conservative&#39;: s...]
n6{if preset_name not in presets}
n7[logger.warning(f&#39;Unknown preset: {pr...]
n8[return False]
n9[]
n10[preset_config = presets[preset_name]...]
n11[self._config = preset_config]
n12[self._validate_config()]
n13[logger.info(f&#39;Applied preset: {prese...]
n14[return True]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
41. scan aiva scan config control center Function export config
flowchart TB
n1([開始])
n2([結束])
n3['導出配置為字典']
n4[return {'crawling': self._da...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;導出配置為字典&#39;]
n4[return {&#39;crawling&#39;: self._da...]
n1 --> n3
n3 --> n4
n4 --> n2
42. scan aiva scan config control center Function get config summary
flowchart TB
n1([開始])
n2([結束])
n3['獲取配置摘要(用於日誌輸出)']
n4[crawl = self._config.crawlin...]
n5[dynamic = self._config.dynamic]
n6[perf = self._config.perform...]
n7[lines = ['Configuration Summ...]
n8[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取配置摘要(用於日誌輸出)&#39;]
n4[crawl = self._config.crawlin...]
n5[dynamic = self._config.dynamic]
n6[perf = self._config.perform...]
n7[lines = [&#39;Configuration Summ...]
n8[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
43. scan aiva scan config control center Function get config
flowchart TB
n1([開始])
n2([結束])
n3['獲取完整配置']
n4[return self._config]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取完整配置&#39;]
n4[return self._config]
n1 --> n3
n3 --> n4
n4 --> n2
44. scan aiva scan config control center Function get crawling config
flowchart TB
n1([開始])
n2([結束])
n3['獲取爬蟲配置']
n4[return self._config.crawling]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取爬蟲配置&#39;]
n4[return self._config.crawling]
n1 --> n3
n3 --> n4
n4 --> n2
45. scan aiva scan config control center Function get dynamic config
flowchart TB
n1([開始])
n2([結束])
n3['獲取動態掃描配置']
n4[return self._config.dynamic]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取動態掃描配置&#39;]
n4[return self._config.dynamic]
n1 --> n3
n3 --> n4
n4 --> n2
46. scan aiva scan config control center Function get fingerprint config
flowchart TB
n1([開始])
n2([結束])
n3['獲取指紋識別配置']
n4[return self._config.fingerprint]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取指紋識別配置&#39;]
n4[return self._config.fingerprint]
n1 --> n3
n3 --> n4
n4 --> n2
47. scan aiva scan config control center Function get performance config
flowchart TB
n1([開始])
n2([結束])
n3['獲取性能配置']
n4[return self._config.performance]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取性能配置&#39;]
n4[return self._config.performance]
n1 --> n3
n3 --> n4
n4 --> n2
48. scan aiva scan config control center Function get reporting config
flowchart TB
n1([開始])
n2([結束])
n3['獲取報告配置']
n4[return self._config.reporting]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取報告配置&#39;]
n4[return self._config.reporting]
n1 --> n3
n3 --> n4
n4 --> n2
49. scan aiva scan config control center Function get security config
flowchart TB
n1([開始])
n2([結束])
n3['獲取安全配置']
n4[return self._config.security]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取安全配置&#39;]
n4[return self._config.security]
n1 --> n3
n3 --> n4
n4 --> n2
50. scan aiva scan config control center Function reset to defaults
flowchart TB
n1([開始])
n2([結束])
n3['重置為默認配置']
n4[self._save_snapshot()]
n5[self._config = ScanModuleConfig()]
n6[logger.info('Reset to default configurati...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置為默認配置&#39;]
n4[self._save_snapshot()]
n5[self._config = ScanModuleConfig()]
n6[logger.info(&#39;Reset to default configurati...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
51. scan aiva scan config control center Function restore previous config
flowchart TB
n1([開始])
n2([結束])
n3['\n 恢復到上一個配置快照\n\n Returns:\n ...]
n4{if not self._config_history}
n5[logger.warning('No previous configuration...]
n6[return False]
n7[]
n8[self._config = self._config_history...]
n9[logger.info('Restored previous configurat...]
n10[return True]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 恢復到上一個配置快照\n\n Returns:\n ...]
n4{if not self._config_history}
n5[logger.warning(&#39;No previous configuration...]
n6[return False]
n7[]
n8[self._config = self._config_history...]
n9[logger.info(&#39;Restored previous configurat...]
n10[return True]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
52. scan aiva scan config control center Function update crawling config
flowchart TB
n1([開始])
n2([結束])
n3['\n 更新爬蟲配置\n\n Args:\n ...]
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.crawli...}
n7[setattr(self._config.crawling, key, value)]
n8[logger.debug(f'Updated crawling config: &...]
n9[logger.warning(f'Unknown crawling config ...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 更新爬蟲配置\n\n Args:\n ...]
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.crawli...}
n7[setattr(self._config.crawling, key, value)]
n8[logger.debug(f&#39;Updated crawling config: &...]
n9[logger.warning(f&#39;Unknown crawling config ...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
53. scan aiva scan config control center Function update dynamic config
flowchart TB
n1([開始])
n2([結束])
n3['更新動態掃描配置']
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.dynami...}
n7[setattr(self._config.dynamic, key, value)]
n8[logger.debug(f'Updated dynamic config: ...]
n9[logger.warning(f'Unknown dynamic config k...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;更新動態掃描配置&#39;]
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.dynami...}
n7[setattr(self._config.dynamic, key, value)]
n8[logger.debug(f&#39;Updated dynamic config: &#...]
n9[logger.warning(f&#39;Unknown dynamic config k...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
54. scan aiva scan config control center Function update performance config
flowchart TB
n1([開始])
n2([結束])
n3['更新性能配置']
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.perfor...}
n7[setattr(self._config.performance, key, value)]
n8[logger.debug(f'Updated performance config...]
n9[logger.warning(f'Unknown performance conf...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;更新性能配置&#39;]
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.perfor...}
n7[setattr(self._config.performance, key, value)]
n8[logger.debug(f&#39;Updated performance config...]
n9[logger.warning(f&#39;Unknown performance conf...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
55. scan aiva scan config control center Function update security config
flowchart TB
n1([開始])
n2([結束])
n3['更新安全配置']
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.securi...}
n7[setattr(self._config.security, key, value)]
n8[logger.debug(f'Updated security config: &...]
n9[logger.warning(f'Unknown security config ...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;更新安全配置&#39;]
n4[self._save_snapshot()]
n5{for (key, value) in kwargs.items()}
n6{if hasattr(self._config.securi...}
n7[setattr(self._config.security, key, value)]
n8[logger.debug(f&#39;Updated security config: &...]
n9[logger.warning(f&#39;Unknown security config ...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n5
n11 --> n2
56. scan aiva scan config control center Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class CrawlingConfig(...)]
n9[class DynamicScanConfig(...)]
n10[class FingerprintConfig(...)]
n11[class SecurityConfig(...)]
n12[class PerformanceConfig(...)]
n13[class ReportingConfig(...)]
n14[class ScanModuleConfig(...)]
n15[class ConfigControlCenter(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class CrawlingConfig(...)]
n9[class DynamicScanConfig(...)]
n10[class FingerprintConfig(...)]
n11[class SecurityConfig(...)]
n12[class PerformanceConfig(...)]
n13[class ReportingConfig(...)]
n14[class ScanModuleConfig(...)]
n15[class ConfigControlCenter(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
57. scan aiva scan core crawling engine init Module
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
58. scan aiva scan core crawling engine http client hi Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化 HTTP 客戶端\n\n Args:\n ...]
n4[self._auth = auth]
n5[self._headers = headers]
n6[self._timeout = timeout]
n7[self._pool_size = pool_size]
n8[self._rate_limiter = RateLimiter(global_r...]
n9[self._client = RetryingAsyncClient(...]
n10[logger.info(f'HTTP client initialized: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化 HTTP 客戶端\n\n Args:\n ...]
n4[self._auth = auth]
n5[self._headers = headers]
n6[self._timeout = timeout]
n7[self._pool_size = pool_size]
n8[self._rate_limiter = RateLimiter(global_r...]
n9[self._client = RetryingAsyncClient(...]
n10[logger.info(f&#39;HTTP client initialized: &#...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
59. scan aiva scan core crawling engine http client hi Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from typing import Any]
n5[from urllib.parse import urlparse]
n6[import httpx]
n7[from services.aiva_common.utils import get_logger]
n8[from services.aiva_common.utils.network import Rat...]
n9[from ..authentication_manager import Authenticatio...]
n10[from ..header_configuration import HeaderConfigura...]
n11[logger = get_logger(__name__)]
n12[class HiHttpClient(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from typing import Any]
n5[from urllib.parse import urlparse]
n6[import httpx]
n7[from services.aiva_common.utils import get_logger]
n8[from services.aiva_common.utils.network import Rat...]
n9[from ..authentication_manager import Authenticatio...]
n10[from ..header_configuration import HeaderConfigura...]
n11[logger = get_logger(__name__)]
n12[class HiHttpClient(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n2
60. scan aiva scan core crawling engine static content parser Function extract
flowchart TB
n1([開始])
n2([結束])
n3[assets: list[Asset] = []]
n4[forms = 0]
n5{if 'text/html' in response.hea...}
n6[soup = BeautifulSoup(respon...]
n7[forms_list = soup.find_all('form&#...]
n8{for form in forms_list}
n9{if not hasattr(form, 'get'...}
n10[continue]
n11[]
n12[action = form.get('action')]
n13{if isinstance(action, str | ty...}
n14[action_url = action or base_url]
n15[full = urljoin(base_url, ac...]
n16[continue]
n17[]
n18[params = []]
n19[input_elements = form.find_all('input...]
n20{for input_elem in input_elements}
n21{if hasattr(input_elem, 'get'&...}
n22[name = input_elem.get('name...]
n23{if isinstance(name, str)}
n24[params.append(name)]
n25[]
n26[]
n27[]
n28[assets.append(Asset(asset_id=new_id(&#...]
n29[forms += 1]
n30[]
n31[links_list = soup.find_all('a'...]
n32{for a in links_list}
n33{if not hasattr(a, 'get')}
n34[continue]
n35[]
n36[href = a.get('href')]
n37{if isinstance(href, str)}
n38[assets.append(Asset(asset_id=new_id(&#...]
n39[]
n40[]
n41[]
n42[return (assets, forms)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n41
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n30
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n16
n14 --> n15
n15 --> n17
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n27
n21 -->|Yes| n22
n21 -->|No| n26
n22 --> n23
n23 -->|Yes| n24
n23 -->|No| n25
n24 --> n25
n25 --> n26
n26 --> n20
n27 --> n28
n28 --> n29
n29 --> n8
n30 --> n31
n31 --> n32
n32 -->|Yes| n33
n32 -->|No| n40
n33 -->|Yes| n34
n33 -->|No| n35
n34 --> n35
n35 --> n36
n36 --> n37
n37 -->|Yes| n38
n37 -->|No| n39
n38 --> n39
n39 --> n32
n40 --> n41
n41 --> n42
n42 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[assets: list[Asset] = []]
n4[forms = 0]
n5{if &#39;text/html&#39; in response.hea...}
n6[soup = BeautifulSoup(respon...]
n7[forms_list = soup.find_all(&#39;form&#...]
n8{for form in forms_list}
n9{if not hasattr(form, &#39;get&#39;...}
n10[continue]
n11[]
n12[action = form.get(&#39;action&#39;)]
n13{if isinstance(action, str | ty...}
n14[action_url = action or base_url]
n15[full = urljoin(base_url, ac...]
n16[continue]
n17[]
n18[params = []]
n19[input_elements = form.find_all(&#39;input...]
n20{for input_elem in input_elements}
n21{if hasattr(input_elem, &#39;get&#39;&...}
n22[name = input_elem.get(&#39;name...]
n23{if isinstance(name, str)}
n24[params.append(name)]
n25[]
n26[]
n27[]
n28[assets.append(Asset(asset_id=new_id(&#...]
n29[forms += 1]
n30[]
n31[links_list = soup.find_all(&#39;a&#39...]
n32{for a in links_list}
n33{if not hasattr(a, &#39;get&#39;)}
n34[continue]
n35[]
n36[href = a.get(&#39;href&#39;)]
n37{if isinstance(href, str)}
n38[assets.append(Asset(asset_id=new_id(&#...]
n39[]
n40[]
n41[]
n42[return (assets, forms)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n41
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n30
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n16
n14 --> n15
n15 --> n17
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n27
n21 -->|Yes| n22
n21 -->|No| n26
n22 --> n23
n23 -->|Yes| n24
n23 -->|No| n25
n24 --> n25
n25 --> n26
n26 --> n20
n27 --> n28
n28 --> n29
n29 --> n8
n30 --> n31
n31 --> n32
n32 -->|Yes| n33
n32 -->|No| n40
n33 -->|Yes| n34
n33 -->|No| n35
n34 --> n35
n35 --> n36
n36 --> n37
n37 -->|Yes| n38
n37 -->|No| n39
n38 --> n39
n39 --> n32
n40 --> n41
n41 --> n42
n42 --> n2
61. scan aiva scan core crawling engine static content parser Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from urllib.parse import urljoin]
n5[from bs4 import BeautifulSoup]
n6[import httpx]
n7[from services.aiva_common.schemas import Asset]
n8[from services.aiva_common.utils.ids import new_id]
n9[class StaticContentParser(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from urllib.parse import urljoin]
n5[from bs4 import BeautifulSoup]
n6[import httpx]
n7[from services.aiva_common.schemas import Asset]
n8[from services.aiva_common.utils.ids import new_id]
n9[class StaticContentParser(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
62. scan aiva scan core crawling engine url queue manager Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化 URL 佇列管理器\n\n Args:\n ...]
n4[self._queue: deque[tuple[str, int]] = deq...]
n5[self._seen: set[str] = set()]
n6[self._processed: set[str] = set()]
n7[self.max_depth = max_depth]
n8{for url in seeds}
n9[normalized = self._normalize_url(...]
n10{if normalized}
n11[self._queue.append((normalized, 0))]
n12[self._seen.add(normalized)]
n13[logger.debug(f'Seed URL added: {norm...]
n14[]
n15[]
n16[logger.info(f'URL queue initialized with ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n15
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n14
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n8
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化 URL 佇列管理器\n\n Args:\n ...]
n4[self._queue: deque[tuple[str, int]] = deq...]
n5[self._seen: set[str] = set()]
n6[self._processed: set[str] = set()]
n7[self.max_depth = max_depth]
n8{for url in seeds}
n9[normalized = self._normalize_url(...]
n10{if normalized}
n11[self._queue.append((normalized, 0))]
n12[self._seen.add(normalized)]
n13[logger.debug(f&#39;Seed URL added: {norm...]
n14[]
n15[]
n16[logger.info(f&#39;URL queue initialized with ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n15
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n14
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n8
n15 --> n16
n16 --> n2
63. scan aiva scan core crawling engine url queue manager Function len
flowchart TB
n1([開始])
n2([結束])
n3['返回佇列中待處理的 URL 數量']
n4[return len(self._queue)]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;返回佇列中待處理的 URL 數量&#39;]
n4[return len(self._queue)]
n1 --> n3
n3 --> n4
n4 --> n2
64. scan aiva scan core crawling engine url queue manager Function repr
flowchart TB
n1([開始])
n2([結束])
n3['返回佇列的字符串表示']
n4[stats = self.get_statistics(...]
n5[return f"UrlQueueManager(queued={stat...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;返回佇列的字符串表示&#39;]
n4[stats = self.get_statistics(...]
n5[return f&quot;UrlQueueManager(queued={stat...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
65. scan aiva scan core crawling engine url queue manager Function normalize url
flowchart TB
n1([開始])
n2([結束])
n3['\n 標準化 URL 以避免重複\n\n 處理:\n ...]
n4[try]
n5[parsed = urlparse(url)]
n6{if not parsed.scheme or not pa...}
n7[return None]
n8[]
n9[normalized = parsed._replace(frag...]
n10[return normalized]
n11[]
n12[except Exception]
n13[logger.warning(f"Failed to normalize URL &am...]
n14[return None]
n1 --> n3
n3 --> n4
n4 --> n5
n4 --> n12
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
n12 --> n13
n13 --> n14
n14 --> n11
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 標準化 URL 以避免重複\n\n 處理:\n ...]
n4[try]
n5[parsed = urlparse(url)]
n6{if not parsed.scheme or not pa...}
n7[return None]
n8[]
n9[normalized = parsed._replace(frag...]
n10[return normalized]
n11[]
n12[except Exception]
n13[logger.warning(f&quot;Failed to normalize URL &am...]
n14[return None]
n1 --> n3
n3 --> n4
n4 --> n5
n4 --> n12
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
n12 --> n13
n13 --> n14
n14 --> n11
66. scan aiva scan core crawling engine url queue manager Function add batch
flowchart TB
n1([開始])
n2([結束])
n3['\n 批量添加 URL\n\n Args:\n ...]
n4[added_count = 0]
n5{for url in urls}
n6{if self.add(url, parent_url, d...}
n7[added_count += 1]
n8[]
n9[]
n10[logger.debug(f'Batch add: {added_cou...]
n11[return added_count]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n9
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n5
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 批量添加 URL\n\n Args:\n ...]
n4[added_count = 0]
n5{for url in urls}
n6{if self.add(url, parent_url, d...}
n7[added_count += 1]
n8[]
n9[]
n10[logger.debug(f&#39;Batch add: {added_cou...]
n11[return added_count]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n9
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n5
n9 --> n10
n10 --> n11
n11 --> n2
67. scan aiva scan core crawling engine url queue manager Function add
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加新的 URL 到佇列\n\n Args:\n ...]
n4{if parent_url and (not urlpars...}
n5[url = urljoin(parent_url, ...]
n6[]
n7[normalized = self._normalize_url(...]
n8{if not normalized}
n9[return False]
n10[]
n11{if normalized in self._seen or...}
n12[return False]
n13[]
n14[self._queue.append((normalized, depth))]
n15[self._seen.add(normalized)]
n16[logger.debug(f'URL added: {normalize...]
n17[return True]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加新的 URL 到佇列\n\n Args:\n ...]
n4{if parent_url and (not urlpars...}
n5[url = urljoin(parent_url, ...]
n6[]
n7[normalized = self._normalize_url(...]
n8{if not normalized}
n9[return False]
n10[]
n11{if normalized in self._seen or...}
n12[return False]
n13[]
n14[self._queue.append((normalized, depth))]
n15[self._seen.add(normalized)]
n16[logger.debug(f&#39;URL added: {normalize...]
n17[return True]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
68. scan aiva scan core crawling engine url queue manager Function clear
flowchart TB
n1([開始])
n2([結束])
n3['清空佇列和所有追蹤集合']
n4[self._queue.clear()]
n5[self._seen.clear()]
n6[self._processed.clear()]
n7[logger.info('URL queue cleared...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空佇列和所有追蹤集合&#39;]
n4[self._queue.clear()]
n5[self._seen.clear()]
n6[self._processed.clear()]
n7[logger.info(&#39;URL queue cleared&#3...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
69. scan aiva scan core crawling engine url queue manager Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取佇列統計信息\n\n Returns:\n ...]
n4[return {'queued': len(se...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取佇列統計信息\n\n Returns:\n ...]
n4[return {&#39;queued&#39;: len(se...]
n1 --> n3
n3 --> n4
n4 --> n2
70. scan aiva scan core crawling engine url queue manager Function has next
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查佇列中是否還有待處理的 URL\n\n Retur...]
n4[return bool(self._queue)]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查佇列中是否還有待處理的 URL\n\n Retur...]
n4[return bool(self._queue)]
n1 --> n3
n3 --> n4
n4 --> n2
71. scan aiva scan core crawling engine url queue manager Function is processed
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查 URL 是否已經處理\n\n Args:\n ...]
n4[normalized = self._normalize_url(...]
n5[return normalized in self._processed ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查 URL 是否已經處理\n\n Args:\n ...]
n4[normalized = self._normalize_url(...]
n5[return normalized in self._processed ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
72. scan aiva scan core crawling engine url queue manager Function is seen
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查 URL 是否已經見過\n\n Args:\n ...]
n4[normalized = self._normalize_url(...]
n5[return normalized in self._seen if no...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查 URL 是否已經見過\n\n Args:\n ...]
n4[normalized = self._normalize_url(...]
n5[return normalized in self._seen if no...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
73. scan aiva scan core crawling engine url queue manager Function next
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取下一個要處理的 URL\n\n Returns:\...]
n4{if not self._queue}
n5[raise IndexError('URL queue is empty&...]
n6[]
n7[(url, depth) = self._queue.popleft(...]
n8[self._processed.add(url)]
n9[logger.debug(f'Dequeued URL: {url...]
n10[return url]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取下一個要處理的 URL\n\n Returns:\...]
n4{if not self._queue}
n5[raise IndexError(&#39;URL queue is empty&...]
n6[]
n7[(url, depth) = self._queue.popleft(...]
n8[self._processed.add(url)]
n9[logger.debug(f&#39;Dequeued URL: {url...]
n10[return url]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
74. scan aiva scan core crawling engine url queue manager Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from collections import deque]
n5[from urllib.parse import urljoin, urlparse]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class UrlQueueManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from collections import deque]
n5[from urllib.parse import urljoin, urlparse]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class UrlQueueManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
75. scan aiva scan dynamic engine init Module
flowchart TB
n1([開始])
n2([結束])
n3['\nDynamic Engine Module\n\n用於處理動態內容的模組,包括:\n...]
n4[from __future__ import annotations]
n5[from .ajax_api_handler import AjaxApiHandler]
n6[from .dynamic_content_extractor import ContentType...]
n7[from .headless_browser_pool import BrowserInstance...]
n8[from .js_interaction_simulator import InteractionR...]
n9[__all__ = ['AjaxApiHandler', ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nDynamic Engine Module\n\n用於處理動態內容的模組,包括:\n...]
n4[from __future__ import annotations]
n5[from .ajax_api_handler import AjaxApiHandler]
n6[from .dynamic_content_extractor import ContentType...]
n7[from .headless_browser_pool import BrowserInstance...]
n8[from .js_interaction_simulator import InteractionR...]
n9[__all__ = [&#39;AjaxApiHandler&#39;, ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
76. scan aiva scan dynamic engine ajax api handler Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化 AJAX/API 處理器']
n4[self.discovered_endpoints: list[dict[str, Any]...]
n5[self.api_pattern_regex = re.compile('...]
n6[logger.debug('AjaxApiHandler initialized&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化 AJAX/API 處理器&#39;]
n4[self.discovered_endpoints: list[dict[str, Any]...]
n5[self.api_pattern_regex = re.compile(&#39;...]
n6[logger.debug(&#39;AjaxApiHandler initialized&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
77. scan aiva scan dynamic engine ajax api handler Function create api asset
flowchart TB
n1([開始])
n2([結束])
n3['\n 創建 API 端點資產\n\n Args:\n ...]
n4[asset = Asset(asset_id=new_i...]
n5[self.discovered_endpoints.append({'u...]
n6[return asset]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 創建 API 端點資產\n\n Args:\n ...]
n4[asset = Asset(asset_id=new_i...]
n5[self.discovered_endpoints.append({&#39;u...]
n6[return asset]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
78. scan aiva scan dynamic engine ajax api handler Function is valid endpoint
flowchart TB
n1([開始])
n2([結束])
n3['\n 判斷是否為有效的 API 端點\n\n Args:\n...]
n4{if self.api_pattern_regex.sear...}
n5[return True]
n6[]
n7[static_extensions = ['.css', ...]
n8[parsed = urlparse(url)]
n9[return not any((parsed.path.lower().e...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 判斷是否為有效的 API 端點\n\n Args:\n...]
n4{if self.api_pattern_regex.sear...}
n5[return True]
n6[]
n7[static_extensions = [&#39;.css&#39;, ...]
n8[parsed = urlparse(url)]
n9[return not any((parsed.path.lower().e...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
79. scan aiva scan dynamic engine ajax api handler Function normalize url
flowchart TB
n1([開始])
n2([結束])
n3['\n 規範化 URL\n\n Args:\n ...]
n4[try]
n5[endpoint = re.sub('\\$\\{[^}...]
n6[endpoint = re.sub('\\{[^}...]
n7{if not endpoint.startswith(('h...}
n8[endpoint = urljoin(base_url, en...]
n9[]
n10[parsed = urlparse(endpoint)]
n11{if parsed.scheme and parsed.ne...}
n12[return endpoint]
n13[]
n14[return None]
n15[]
n16[except Exception]
n17[logger.warning(f'Failed to normalize URL ...]
n18[return None]
n1 --> n3
n3 --> n4
n4 --> n5
n4 --> n16
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
n16 --> n17
n17 --> n18
n18 --> n15
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 規範化 URL\n\n Args:\n ...]
n4[try]
n5[endpoint = re.sub(&#39;\\$\\{[^}...]
n6[endpoint = re.sub(&#39;\\{[^}&#...]
n7{if not endpoint.startswith((&#39;h...}
n8[endpoint = urljoin(base_url, en...]
n9[]
n10[parsed = urlparse(endpoint)]
n11{if parsed.scheme and parsed.ne...}
n12[return endpoint]
n13[]
n14[return None]
n15[]
n16[except Exception]
n17[logger.warning(f&#39;Failed to normalize URL ...]
n18[return None]
n1 --> n3
n3 --> n4
n4 --> n5
n4 --> n16
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
n16 --> n17
n17 --> n18
n18 --> n15
80. scan aiva scan dynamic engine ajax api handler Function get discovered endpoints
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取已發現的端點列表\n\n Returns:\n ...]
n4[return self.discovered_endpoints.copy...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取已發現的端點列表\n\n Returns:\n ...]
n4[return self.discovered_endpoints.copy...]
n1 --> n3
n3 --> n4
n4 --> n2
81. scan aiva scan dynamic engine ajax api handler Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取統計信息\n\n Returns:\n ...]
n4[stats = {'total_endpoints': ...]
n5{for endpoint in self.discovered_e...}
n6[source = endpoint['source']]
n7[method = endpoint['method']]
n8[stats['by_source'][so...]
n9[stats['by_method'][me...]
n10[]
n11[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取統計信息\n\n Returns:\n ...]
n4[stats = {&#39;total_endpoints&#39;: ...]
n5{for endpoint in self.discovered_e...}
n6[source = endpoint[&#39;source&#39;]]
n7[method = endpoint[&#39;method&#39;]]
n8[stats[&#39;by_source&#39;][so...]
n9[stats[&#39;by_method&#39;][me...]
n10[]
n11[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
82. scan aiva scan dynamic engine ajax api handler Module
flowchart TB
n1([開始])
n2([結束])
n3['\nAJAX 和 API 端點處理器\n擴展動態引擎以識別和處理 AJAX 請求和 AP...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from urllib.parse import urljoin, urlparse]
n8[from services.aiva_common.schemas import Asset]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class AjaxApiHandler(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nAJAX 和 API 端點處理器\n擴展動態引擎以識別和處理 AJAX 請求和 AP...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from urllib.parse import urljoin, urlparse]
n8[from services.aiva_common.schemas import Asset]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class AjaxApiHandler(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
83. scan aiva scan dynamic engine dynamic content extractor Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化動態內容提取器\n\n Args:\n ...]
n4[self.config = config or Extraction...]
n5[self._network_requests: list[NetworkRequest] = ...]
n6[self._extracted_contents: list[DynamicContent] = ...]
n7[self._mutation_observer_script: str | None = None]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化動態內容提取器\n\n Args:\n ...]
n4[self.config = config or Extraction...]
n5[self._network_requests: list[NetworkRequest] = &#...]
n6[self._extracted_contents: list[DynamicContent] = ...]
n7[self._mutation_observer_script: str | None = None]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
84. scan aiva scan dynamic engine dynamic content extractor Function clear
flowchart TB
n1([開始])
n2([結束])
n3['清空已提取的內容和網絡請求']
n4[self._extracted_contents.clear()]
n5[self._network_requests.clear()]
n6[logger.debug('Cleared extracted contents ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空已提取的內容和網絡請求&#39;]
n4[self._extracted_contents.clear()]
n5[self._network_requests.clear()]
n6[logger.debug(&#39;Cleared extracted contents ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
85. scan aiva scan dynamic engine dynamic content extractor Function convert to assets
flowchart TB
n1([開始])
n2([結束])
n3['\n 將動態內容轉換為 Asset 對象\n\n Args:...]
n4{if contents is None}
n5[contents = self._extracted_cont...]
n6[]
n7[assets: list[Asset] = []]
n8{for content in contents}
n9[try]
n10{if content.content_type == Con...}
n11[params = []]
n12{for input_data in content.attribute...}
n13{if input_data.get('name')}
n14[params.append(input_data['name&...]
n15[]
n16[]
n17[asset = Asset(asset_id=conte...]
n18[assets.append(asset)]
n19{if content.content_type == Con...}
n20[asset = Asset(asset_id=conte...]
n21[assets.append(asset)]
n22[]
n23[]
n24[]
n25[except Exception]
n26[logger.debug(f'Failed to convert content ...]
n27[]
n28[return assets]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n27
n9 --> n10
n9 --> n25
n10 -->|Yes| n11
n10 -->|No| n19
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n15
n15 --> n12
n16 --> n17
n17 --> n18
n18 --> n23
n19 -->|Yes| n20
n19 -->|No| n22
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n8
n25 --> n26
n26 --> n24
n27 --> n28
n28 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 將動態內容轉換為 Asset 對象\n\n Args:...]
n4{if contents is None}
n5[contents = self._extracted_cont...]
n6[]
n7[assets: list[Asset] = []]
n8{for content in contents}
n9[try]
n10{if content.content_type == Con...}
n11[params = []]
n12{for input_data in content.attribute...}
n13{if input_data.get(&#39;name&#39;)}
n14[params.append(input_data[&#39;name&&#...]
n15[]
n16[]
n17[asset = Asset(asset_id=conte...]
n18[assets.append(asset)]
n19{if content.content_type == Con...}
n20[asset = Asset(asset_id=conte...]
n21[assets.append(asset)]
n22[]
n23[]
n24[]
n25[except Exception]
n26[logger.debug(f&#39;Failed to convert content ...]
n27[]
n28[return assets]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n27
n9 --> n10
n9 --> n25
n10 -->|Yes| n11
n10 -->|No| n19
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n15
n15 --> n12
n16 --> n17
n17 --> n18
n18 --> n23
n19 -->|Yes| n20
n19 -->|No| n22
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n8
n25 --> n26
n26 --> n24
n27 --> n28
n28 --> n2
86. scan aiva scan dynamic engine dynamic content extractor Function get contents by type
flowchart TB
n1([開始])
n2([結束])
n3['按類型獲取內容']
n4[return [c for c in self._extracted_co...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;按類型獲取內容&#39;]
n4[return [c for c in self._extracted_co...]
n1 --> n3
n3 --> n4
n4 --> n2
87. scan aiva scan dynamic engine dynamic content extractor Function get extracted contents
flowchart TB
n1([開始])
n2([結束])
n3['獲取所有已提取的內容']
n4[return self._extracted_contents.copy(...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取所有已提取的內容&#39;]
n4[return self._extracted_contents.copy(...]
n1 --> n3
n3 --> n4
n4 --> n2
88. scan aiva scan dynamic engine dynamic content extractor Function get network requests
flowchart TB
n1([開始])
n2([結束])
n3['獲取所有網絡請求']
n4[return self._network_requests.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取所有網絡請求&#39;]
n4[return self._network_requests.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
89. scan aiva scan dynamic engine dynamic content extractor Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['獲取統計信息']
n4[type_counts: dict[str, int] = {}]
n5{for content in self._extracted_c...}
n6[type_name = content.content_type...]
n7[type_counts[type_name] = type_counts.get(type...]
n8[]
n9[return {'total_contents': le...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取統計信息&#39;]
n4[type_counts: dict[str, int] = {}]
n5{for content in self._extracted_c...}
n6[type_name = content.content_type...]
n7[type_counts[type_name] = type_counts.get(type...]
n8[]
n9[return {&#39;total_contents&#39;: le...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
90. scan aiva scan dynamic engine dynamic content extractor Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from dataclasses import dataclass, field]
n6[from datetime import datetime]
n7[from enum import Enum]
n8[import re]
n9[from typing import Any]
n10[from urllib.parse import urljoin]
n11[from bs4 import BeautifulSoup]
n12[from services.aiva_common.schemas import Asset]
n13[from services.aiva_common.utils import get_logger]
n14[from services.aiva_common.utils.ids import new_id]
n15[logger = get_logger(__name__)]
n16[class ContentType(...)]
n17[class ExtractionStrategy(...)]
n18[class DynamicContent(...)]
n19[class NetworkRequest(...)]
n20[class ExtractionConfig(...)]
n21[class DynamicContentExtractor(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from dataclasses import dataclass, field]
n6[from datetime import datetime]
n7[from enum import Enum]
n8[import re]
n9[from typing import Any]
n10[from urllib.parse import urljoin]
n11[from bs4 import BeautifulSoup]
n12[from services.aiva_common.schemas import Asset]
n13[from services.aiva_common.utils import get_logger]
n14[from services.aiva_common.utils.ids import new_id]
n15[logger = get_logger(__name__)]
n16[class ContentType(...)]
n17[class ExtractionStrategy(...)]
n18[class DynamicContent(...)]
n19[class NetworkRequest(...)]
n20[class ExtractionConfig(...)]
n21[class DynamicContentExtractor(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n2
91. scan aiva scan dynamic engine example browser pool Module
flowchart TB
n1([開始])
n2([結束])
n3['\nHeadlessBrowserPool 使用範例\n\n展示如何使用 Headles...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from .headless_browser_pool import BrowserType, He...]
n7[def example_basic_usage(...)]
n8[def example_custom_config(...)]
n9[def example_execute_callback(...)]
n10[def example_multiple_pages(...)]
n11[def example_browser_info(...)]
n12[def example_cleanup(...)]
n13[def example_error_handling(...)]
n14[def main(...)]
n15{if __name__ == '__main__'}
n16[asyncio.run(main())]
n17[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nHeadlessBrowserPool 使用範例\n\n展示如何使用 Headles...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from .headless_browser_pool import BrowserType, He...]
n7[def example_basic_usage(...)]
n8[def example_custom_config(...)]
n9[def example_execute_callback(...)]
n10[def example_multiple_pages(...)]
n11[def example_browser_info(...)]
n12[def example_cleanup(...)]
n13[def example_error_handling(...)]
n14[def main(...)]
n15{if __name__ == &#39;__main__&#39;}
n16[asyncio.run(main())]
n17[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n2
92. scan aiva scan dynamic engine example extractor Module
flowchart TB
n1([開始])
n2([結束])
n3['\nDynamicContentExtractor 使用範例\n\n展示如何使用 Dyn...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from .dynamic_content_extractor import ContentType...]
n7[from .headless_browser_pool import HeadlessBrowser...]
n8[def example_basic_usage(...)]
n9[def example_with_browser_pool(...)]
n10[def example_custom_config(...)]
n11[def example_extract_by_type(...)]
n12[def example_network_requests(...)]
n13[def example_convert_to_assets(...)]
n14[def example_after_interaction(...)]
n15[def example_clear_and_reuse(...)]
n16[def main(...)]
n17{if __name__ == '__main__'}
n18[asyncio.run(main())]
n19[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n19
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nDynamicContentExtractor 使用範例\n\n展示如何使用 Dyn...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[from .dynamic_content_extractor import ContentType...]
n7[from .headless_browser_pool import HeadlessBrowser...]
n8[def example_basic_usage(...)]
n9[def example_with_browser_pool(...)]
n10[def example_custom_config(...)]
n11[def example_extract_by_type(...)]
n12[def example_network_requests(...)]
n13[def example_convert_to_assets(...)]
n14[def example_after_interaction(...)]
n15[def example_clear_and_reuse(...)]
n16[def main(...)]
n17{if __name__ == &#39;__main__&#39;}
n18[asyncio.run(main())]
n19[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n19
n18 --> n19
n19 --> n2
93. scan aiva scan dynamic engine example usage Module
flowchart TB
n1([開始])
n2([結束])
n3['\nJsInteractionSimulator 使用範例\n\n展示如何使用 JsIn...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[import logging]
n7[from .js_interaction_simulator import InteractionT...]
n8[logger = logging.getLogger(__...]
n9[def example_basic_usage(...)]
n10[def example_advanced_usage(...)]
n11[def example_with_playwright(...)]
n12[def example_error_handling(...)]
n13[def main(...)]
n14{if __name__ == '__main__'}
n15[asyncio.run(main())]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nJsInteractionSimulator 使用範例\n\n展示如何使用 JsIn...]
n4[from __future__ import annotations]
n5[import asyncio]
n6[import logging]
n7[from .js_interaction_simulator import InteractionT...]
n8[logger = logging.getLogger(__...]
n9[def example_basic_usage(...)]
n10[def example_advanced_usage(...)]
n11[def example_with_playwright(...)]
n12[def example_error_handling(...)]
n13[def main(...)]
n14{if __name__ == &#39;__main__&#39;}
n15[asyncio.run(main())]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n2
94. scan aiva scan dynamic engine headless browser pool Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化瀏覽器池\n\n Args:\n ...]
n4[self.config = config or PoolConfig...]
n5[self._browsers: dict[str, BrowserInstance] = ...]
n6[self._pages: dict[str, PageInstance] = {}]
n7[self._browser_semaphore = asyncio.Semaphore(se...]
n8[self._playwright: Any = None]
n9[self._is_initialized = False]
n10[self._next_browser_id = 0]
n11[self._next_page_id = 0]
n12[self._lock = asyncio.Lock()]
n13[self._stats = {'browsers_created&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化瀏覽器池\n\n Args:\n ...]
n4[self.config = config or PoolConfig...]
n5[self._browsers: dict[str, BrowserInstance] = ...]
n6[self._pages: dict[str, PageInstance] = {}]
n7[self._browser_semaphore = asyncio.Semaphore(se...]
n8[self._playwright: Any = None]
n9[self._is_initialized = False]
n10[self._next_browser_id = 0]
n11[self._next_page_id = 0]
n12[self._lock = asyncio.Lock()]
n13[self._stats = {&#39;browsers_created&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
95. scan aiva scan dynamic engine headless browser pool Function get browser info
flowchart TB
n1([開始])
n2([結束])
n3['獲取指定瀏覽器的詳細信息']
n4[browser_instance = self._browsers.get(b...]
n5{if not browser_instance}
n6[return None]
n7[]
n8[return {'browser_id': browse...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取指定瀏覽器的詳細信息&#39;]
n4[browser_instance = self._browsers.get(b...]
n5{if not browser_instance}
n6[return None]
n7[]
n8[return {&#39;browser_id&#39;: browse...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
96. scan aiva scan dynamic engine headless browser pool Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['獲取統計信息']
n4[active_browsers = sum((1 for b in self...]
n5[active_pages = sum((1 for p in self...]
n6[browser_types: dict[str, int] = defaultdict(i...]
n7{for browser in self._browsers.va...}
n8[browser_types[browser.browser_type.value] += 1]
n9[]
n10[return {'initialized': self....]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n7
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取統計信息&#39;]
n4[active_browsers = sum((1 for b in self...]
n5[active_pages = sum((1 for p in self...]
n6[browser_types: dict[str, int] = defaultdict(i...]
n7{for browser in self._browsers.va...}
n8[browser_types[browser.browser_type.value] += 1]
n9[]
n10[return {&#39;initialized&#39;: self....]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n7
n9 --> n10
n10 --> n2
97. scan aiva scan dynamic engine headless browser pool Function list browsers
flowchart TB
n1([開始])
n2([結束])
n3['列出所有瀏覽器實例信息']
n4[result = []]
n5{for bid in self._browsers}
n6[info = self.get_browser_inf...]
n7{if info}
n8[result.append(info)]
n9[]
n10[]
n11[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;列出所有瀏覽器實例信息&#39;]
n4[result = []]
n5{for bid in self._browsers}
n6[info = self.get_browser_inf...]
n7{if info}
n8[result.append(info)]
n9[]
n10[]
n11[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n10
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n2
98. scan aiva scan dynamic engine headless browser pool Function list pages
flowchart TB
n1([開始])
n2([結束])
n3['列出所有頁面實例信息']
n4[pages_info = []]
n5{for page_instance in self._pages.values()}
n6[pages_info.append({'page_id&#...]
n7[]
n8[return pages_info]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n5
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;列出所有頁面實例信息&#39;]
n4[pages_info = []]
n5{for page_instance in self._pages.values()}
n6[pages_info.append({&#39;page_id&#...]
n7[]
n8[return pages_info]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n5
n7 --> n8
n8 --> n2
99. scan aiva scan dynamic engine headless browser pool Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from collections import defaultdict]
n6[from collections.abc import AsyncIterator]
n7[from contextlib import asynccontextmanager]
n8[from dataclasses import dataclass, field]
n9[from datetime import datetime]
n10[from enum import Enum]
n11[from typing import Any]
n12[from services.aiva_common.utils import get_logger]
n13[logger = get_logger(__name__)]
n14[class BrowserType(...)]
n15[class BrowserStatus(...)]
n16[class BrowserInstance(...)]
n17[class PageInstance(...)]
n18[class PoolConfig(...)]
n19[class HeadlessBrowserPool(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from collections import defaultdict]
n6[from collections.abc import AsyncIterator]
n7[from contextlib import asynccontextmanager]
n8[from dataclasses import dataclass, field]
n9[from datetime import datetime]
n10[from enum import Enum]
n11[from typing import Any]
n12[from services.aiva_common.utils import get_logger]
n13[logger = get_logger(__name__)]
n14[class BrowserType(...)]
n15[class BrowserStatus(...)]
n16[class BrowserInstance(...)]
n17[class PageInstance(...)]
n18[class PoolConfig(...)]
n19[class HeadlessBrowserPool(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
100. scan aiva scan dynamic engine js interaction simulator Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化 JS 互動模擬器\n\n Args:\n ...]
n4[self.max_retry = max_retry]
n5[self.default_timeout_ms = default_timeout_ms]
n6[self.enable_logging = enable_logging]
n7[self._event_queue: list[JsEvent] = []]
n8[self._results: list[InteractionResult] = []]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化 JS 互動模擬器\n\n Args:\n ...]
n4[self.max_retry = max_retry]
n5[self.default_timeout_ms = default_timeout_ms]
n6[self.enable_logging = enable_logging]
n7[self._event_queue: list[JsEvent] = []]
n8[self._results: list[InteractionResult] = []]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
101. scan aiva scan dynamic engine js interaction simulator Function get events by type
flowchart TB
n1([開始])
n2([結束])
n3['按類型統計事件數量']
n4[stats: dict[str, int] = {}]
n5{for result in self._results}
n6[event_type = result.event.event_t...]
n7[stats[event_type] = stats.get(event_type...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;按類型統計事件數量&#39;]
n4[stats: dict[str, int] = {}]
n5{for result in self._results}
n6[event_type = result.event.event_t...]
n7[stats[event_type] = stats.get(event_type...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
102. scan aiva scan dynamic engine js interaction simulator Function add click
flowchart TB
n1([開始])
n2([結束])
n3['添加點擊事件']
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加點擊事件&#39;]
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
103. scan aiva scan dynamic engine js interaction simulator Function add event
flowchart TB
n1([開始])
n2([結束])
n3['添加事件到隊列']
n4[self._event_queue.append(event)]
n5{if self.enable_logging}
n6[logger.debug(f'Added event to queue: ...]
n7[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加事件到隊列&#39;]
n4[self._event_queue.append(event)]
n5{if self.enable_logging}
n6[logger.debug(f&#39;Added event to queue: ...]
n7[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n2
104. scan aiva scan dynamic engine js interaction simulator Function add hover
flowchart TB
n1([開始])
n2([結束])
n3['添加懸停事件']
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加懸停事件&#39;]
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
105. scan aiva scan dynamic engine js interaction simulator Function add input
flowchart TB
n1([開始])
n2([結束])
n3['添加輸入事件']
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加輸入事件&#39;]
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
106. scan aiva scan dynamic engine js interaction simulator Function add scroll
flowchart TB
n1([開始])
n2([結束])
n3['添加滾動事件']
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加滾動事件&#39;]
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
107. scan aiva scan dynamic engine js interaction simulator Function add submit
flowchart TB
n1([開始])
n2([結束])
n3['添加表單提交事件']
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;添加表單提交事件&#39;]
n4[event = JsEvent(event_type=I...]
n5[self.add_event(event)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
108. scan aiva scan dynamic engine js interaction simulator Function clear queue
flowchart TB
n1([開始])
n2([結束])
n3['清空事件隊列']
n4[self._event_queue.clear()]
n5{if self.enable_logging}
n6[logger.debug('Event queue cleared&...]
n7[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空事件隊列&#39;]
n4[self._event_queue.clear()]
n5{if self.enable_logging}
n6[logger.debug(&#39;Event queue cleared&...]
n7[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n2
109. scan aiva scan dynamic engine js interaction simulator Function get results
flowchart TB
n1([開始])
n2([結束])
n3['獲取所有互動結果']
n4[return self._results.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取所有互動結果&#39;]
n4[return self._results.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
110. scan aiva scan dynamic engine js interaction simulator Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['獲取統計信息']
n4{if not self._results}
n5[return {'total_events': 0, &...]
n6[]
n7[successful = sum((1 for r in self...]
n8[failed = len(self._results) -...]
n9[avg_time = sum((r.execution_tim...]
n10[return {'total_events': len&...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取統計信息&#39;]
n4{if not self._results}
n5[return {&#39;total_events&#39;: 0, &...]
n6[]
n7[successful = sum((1 for r in self...]
n8[failed = len(self._results) -...]
n9[avg_time = sum((r.execution_tim...]
n10[return {&#39;total_events&#39;: len&...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
111. scan aiva scan dynamic engine js interaction simulator Function get success rate
flowchart TB
n1([開始])
n2([結束])
n3['獲取成功率']
n4{if not self._results}
n5[return 0.0]
n6[]
n7[successful = sum((1 for r in self...]
n8[return successful / len(self._results...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取成功率&#39;]
n4{if not self._results}
n5[return 0.0]
n6[]
n7[successful = sum((1 for r in self...]
n8[return successful / len(self._results...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
112. scan aiva scan dynamic engine js interaction simulator Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from dataclasses import dataclass, field]
n6[from enum import Enum]
n7[from typing import Any]
n8[from services.aiva_common.utils import get_logger]
n9[logger = get_logger(__name__)]
n10[class InteractionType(...)]
n11[class JsEvent(...)]
n12[class InteractionResult(...)]
n13[class JsInteractionSimulator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import asyncio]
n5[from dataclasses import dataclass, field]
n6[from enum import Enum]
n7[from typing import Any]
n8[from services.aiva_common.utils import get_logger]
n9[logger = get_logger(__name__)]
n10[class InteractionType(...)]
n11[class JsEvent(...)]
n12[class InteractionResult(...)]
n13[class JsInteractionSimulator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
113. scan aiva scan fingerprint manager Function init
flowchart TB
n1([開始])
n2([結束])
n3[self.passive_fp = PassiveFingerprinter...]
n4[self.merger = FingerprintMerger()]
n5[self.collected_fingerprints: Fingerprints | None =...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[self.passive_fp = PassiveFingerprinter...]
n4[self.merger = FingerprintMerger()]
n5[self.collected_fingerprints: Fingerprints | None =...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
114. scan aiva scan fingerprint manager Function get final fingerprints
flowchart TB
n1([開始])
n2([結束])
n3['獲取最終合併的指紋信息']
n4[return self.collected_fingerprints]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取最終合併的指紋信息&#39;]
n4[return self.collected_fingerprints]
n1 --> n3
n3 --> n4
n4 --> n2
115. scan aiva scan fingerprint manager Function merge
flowchart TB
n1([開始])
n2([結束])
n3['合併兩個指紋對象,使用類型安全的邏輯']
n4{if existing is None}
n5[return new]
n6[]
n7[return Fingerprints(web_server=new.we...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;合併兩個指紋對象,使用類型安全的邏輯&#39;]
n4{if existing is None}
n5[return new]
n6[]
n7[return Fingerprints(web_server=new.we...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
116. scan aiva scan fingerprint manager Function reset
flowchart TB
n1([開始])
n2([結束])
n3['重置收集器狀態']
n4[self.collected_fingerprints = None]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置收集器狀態&#39;]
n4[self.collected_fingerprints = None]
n1 --> n3
n3 --> n4
n4 --> n2
117. scan aiva scan fingerprint manager Module
flowchart TB
n1([開始])
n2([結束])
n3['\n指紋管理器 - 負責收集、合併和管理掃描過程中的指紋信息\n']
n4[from __future__ import annotations]
n5[import httpx]
n6[from services.aiva_common.schemas import Fingerpri...]
n7[from .info_gatherer.passive_fingerprinter import P...]
n8[class FingerprintMerger(...)]
n9[class FingerprintCollector(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n指紋管理器 - 負責收集、合併和管理掃描過程中的指紋信息\n&#39;]
n4[from __future__ import annotations]
n5[import httpx]
n6[from services.aiva_common.schemas import Fingerpri...]
n7[from .info_gatherer.passive_fingerprinter import P...]
n8[class FingerprintMerger(...)]
n9[class FingerprintCollector(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
118. scan aiva scan header configuration Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化頭配置管理器\n\n Args:\n ...]
n4[self.user_headers = user_headers or {}]
n5[self._custom_user_agent = user_agent]
n6[self._rotate_user_agent = rotate_user_agent]
n7[self._include_default_headers = include_default_head...]
n8[self._current_user_agent = user_agent or self._...]
n9[logger.debug(f'HeaderConfiguration initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化頭配置管理器\n\n Args:\n ...]
n4[self.user_headers = user_headers or {}]
n5[self._custom_user_agent = user_agent]
n6[self._rotate_user_agent = rotate_user_agent]
n7[self._include_default_headers = include_default_head...]
n8[self._current_user_agent = user_agent or self._...]
n9[logger.debug(f&#39;HeaderConfiguration initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
119. scan aiva scan header configuration Function get random user agent
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取隨機 User-Agent\n\n Returns...]
n4[return random.choice(self._DEFAULT_US...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取隨機 User-Agent\n\n Returns...]
n4[return random.choice(self._DEFAULT_US...]
n1 --> n3
n3 --> n4
n4 --> n2
120. scan aiva scan header configuration Function add header
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加或更新一個自定義頭\n\n Args:\n ...]
n4[self.user_headers[key] = value]
n5[logger.debug(f'Added/updated header: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加或更新一個自定義頭\n\n Args:\n ...]
n4[self.user_headers[key] = value]
n5[logger.debug(f&#39;Added/updated header: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
121. scan aiva scan header configuration Function clear custom headers
flowchart TB
n1([開始])
n2([結束])
n3['清除所有自定義頭']
n4[self.user_headers.clear()]
n5[logger.debug('Cleared all custom headers&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清除所有自定義頭&#39;]
n4[self.user_headers.clear()]
n5[logger.debug(&#39;Cleared all custom headers&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
122. scan aiva scan header configuration Function clone
flowchart TB
n1([開始])
n2([結束])
n3['\n 克隆當前配置\n\n Returns:\n ...]
n4[new_config = HeaderConfiguration(...]
n5[return new_config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 克隆當前配置\n\n Returns:\n ...]
n4[new_config = HeaderConfiguration(...]
n5[return new_config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
123. scan aiva scan header configuration Function create api config
flowchart TB
n1([開始])
n2([結束])
n3['\n 創建 API 請求配置\n\n Args:\n ...]
n4[headers = {'Accept': &...]
n5{if api_key}
n6[headers['X-API-Key'] = ap...]
n7[]
n8[config = cls(user_headers=hea...]
n9[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 創建 API 請求配置\n\n Args:\n ...]
n4[headers = {&#39;Accept&#39;: &&#...]
n5{if api_key}
n6[headers[&#39;X-API-Key&#39;] = ap...]
n7[]
n8[config = cls(user_headers=hea...]
n9[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
124. scan aiva scan header configuration Function create minimal config
flowchart TB
n1([開始])
n2([結束])
n3['\n 創建最小配置(只有必要的頭)\n\n Returns:...]
n4[config = cls(user_headers={},...]
n5[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 創建最小配置(只有必要的頭)\n\n Returns:...]
n4[config = cls(user_headers={},...]
n5[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
125. scan aiva scan header configuration Function create stealth config
flowchart TB
n1([開始])
n2([結束])
n3['\n 創建隱秘模式配置(模擬真實瀏覽器)\n\n Retur...]
n4[config = cls(user_headers={'A...]
n5[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 創建隱秘模式配置(模擬真實瀏覽器)\n\n Retur...]
n4[config = cls(user_headers={&#39;A...]
n5[return config]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
126. scan aiva scan header configuration Function enable user agent rotation
flowchart TB
n1([開始])
n2([結束])
n3['\n 啟用或禁用 User-Agent 輪換\n\n Arg...]
n4[self._rotate_user_agent = enable]
n5[logger.debug(f"User-Agent rotation: {...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 啟用或禁用 User-Agent 輪換\n\n Arg...]
n4[self._rotate_user_agent = enable]
n5[logger.debug(f&quot;User-Agent rotation: {&#...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
127. scan aiva scan header configuration Function from dict
flowchart TB
n1([開始])
n2([結束])
n3['\n 從字典創建配置\n\n Args:\n ...]
n4[return cls(user_headers=config_dict.g...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 從字典創建配置\n\n Args:\n ...]
n4[return cls(user_headers=config_dict.g...]
n1 --> n3
n3 --> n4
n4 --> n2
128. scan aiva scan header configuration Function get custom headers
flowchart TB
n1([開始])
n2([結束])
n3['獲取用戶自定義的頭']
n4[return self.user_headers.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取用戶自定義的頭&#39;]
n4[return self.user_headers.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
129. scan aiva scan header configuration Function get default headers
flowchart TB
n1([開始])
n2([結束])
n3['獲取默認的系統頭']
n4[return cls._DEFAULT_HEADERS.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取默認的系統頭&#39;]
n4[return cls._DEFAULT_HEADERS.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
130. scan aiva scan header configuration Function get default user agents
flowchart TB
n1([開始])
n2([結束])
n3['獲取所有默認的 User-Agent 列表']
n4[return cls._DEFAULT_USER_AGENTS.copy(...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取所有默認的 User-Agent 列表&#39;]
n4[return cls._DEFAULT_USER_AGENTS.copy(...]
n1 --> n3
n3 --> n4
n4 --> n2
131. scan aiva scan header configuration Function get headers for api
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取適合 API 請求的頭\n\n Returns:\...]
n4[headers = {'Accept': &...]
n5[headers.update(self.user_headers)]
n6[return headers]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取適合 API 請求的頭\n\n Returns:\...]
n4[headers = {&#39;Accept&#39;: &&#...]
n5[headers.update(self.user_headers)]
n6[return headers]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
132. scan aiva scan header configuration Function get headers summary
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取頭配置摘要\n\n Returns:\n ...]
n4[lines = ['Header Configurati...]
n5{if self.user_headers}
n6[lines.append(' Custom Header Keys:&&...]
n7{for key in list(self.user_he...}
n8[lines.append(f' - {key}&...]
n9[]
n10{if len(self.user_headers) > 10}
n11[lines.append(f' ... and {len(...]
n12[]
n13[]
n14[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n7
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取頭配置摘要\n\n Returns:\n ...]
n4[lines = [&#39;Header Configurati...]
n5{if self.user_headers}
n6[lines.append(&#39; Custom Header Keys:&&...]
n7{for key in list(self.user_he...}
n8[lines.append(f&#39; - {key}&...]
n9[]
n10{if len(self.user_headers) &gt; 10}
n11[lines.append(f&#39; ... and {len(...]
n12[]
n13[]
n14[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n7
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
133. scan aiva scan header configuration Function get headers
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取組裝後的 HTTP 頭\n\n Args:\n ...]
n4[headers = {}]
n5{if self._include_default_headers}
n6[headers.update(self._DEFAULT_HEADERS)]
n7[]
n8{if self._rotate_user_agent}
n9[self._current_user_agent = self._get_random_use...]
n10[]
n11[headers['User-Agent'] = s...]
n12{if for_json}
n13[headers['Content-Type'] =...]
n14[headers['Accept'] = &...]
n15[]
n16[headers.update(self.user_headers)]
n17[return headers]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n15
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取組裝後的 HTTP 頭\n\n Args:\n ...]
n4[headers = {}]
n5{if self._include_default_headers}
n6[headers.update(self._DEFAULT_HEADERS)]
n7[]
n8{if self._rotate_user_agent}
n9[self._current_user_agent = self._get_random_use...]
n10[]
n11[headers[&#39;User-Agent&#39;] = s...]
n12{if for_json}
n13[headers[&#39;Content-Type&#39;] =...]
n14[headers[&#39;Accept&#39;] = &...]
n15[]
n16[headers.update(self.user_headers)]
n17[return headers]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n15
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n2
134. scan aiva scan header configuration Function get user agent
flowchart TB
n1([開始])
n2([結束])
n3['獲取當前的 User-Agent']
n4[return self._current_user_agent]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取當前的 User-Agent&#39;]
n4[return self._current_user_agent]
n1 --> n3
n3 --> n4
n4 --> n2
135. scan aiva scan header configuration Function merge headers
flowchart TB
n1([開始])
n2([結束])
n3['\n 合併額外的頭\n\n Args:\n ...]
n4[self.user_headers.update(additional_headers)]
n5[logger.debug(f'Merged {len(addit...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 合併額外的頭\n\n Args:\n ...]
n4[self.user_headers.update(additional_headers)]
n5[logger.debug(f&#39;Merged {len(addit...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
136. scan aiva scan header configuration Function remove header
flowchart TB
n1([開始])
n2([結束])
n3['\n 移除一個自定義頭\n\n Args:\n ...]
n4{if key in self.user_headers}
n5[del self.user_headers[key]]
n6[logger.debug(f'Removed header: {key&...]
n7[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 移除一個自定義頭\n\n Args:\n ...]
n4{if key in self.user_headers}
n5[del self.user_headers[key]]
n6[logger.debug(f&#39;Removed header: {key&...]
n7[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n2
137. scan aiva scan header configuration Function set authorization
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置 Authorization 頭\n\n Args...]
n4[self.add_header('Authorization...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置 Authorization 頭\n\n Args...]
n4[self.add_header(&#39;Authorization&#3...]
n1 --> n3
n3 --> n4
n4 --> n2
138. scan aiva scan header configuration Function set cookie
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置 Cookie 頭\n\n Args:\n ...]
n4[self.add_header('Cookie', coo...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置 Cookie 頭\n\n Args:\n ...]
n4[self.add_header(&#39;Cookie&#39;, coo...]
n1 --> n3
n3 --> n4
n4 --> n2
139. scan aiva scan header configuration Function set referer
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置 Referer 頭\n\n Args:\n ...]
n4[self.add_header('Referer', re...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置 Referer 頭\n\n Args:\n ...]
n4[self.add_header(&#39;Referer&#39;, re...]
n1 --> n3
n3 --> n4
n4 --> n2
140. scan aiva scan header configuration Function set user agent
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置自定義 User-Agent\n\n Args:\...]
n4[self._custom_user_agent = user_agent]
n5[self._current_user_agent = user_agent]
n6[logger.debug(f'Set custom User-Agent: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置自定義 User-Agent\n\n Args:\...]
n4[self._custom_user_agent = user_agent]
n5[self._current_user_agent = user_agent]
n6[logger.debug(f&#39;Set custom User-Agent: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
141. scan aiva scan header configuration Function to dict
flowchart TB
n1([開始])
n2([結束])
n3['\n 將配置轉換為字典\n\n Returns:\n ...]
n4[return {'user_headers': self...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 將配置轉換為字典\n\n Returns:\n ...]
n4[return {&#39;user_headers&#39;: self...]
n1 --> n3
n3 --> n4
n4 --> n2
142. scan aiva scan header configuration Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import random]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class HeaderConfiguration(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import random]
n5[from typing import Any]
n6[from services.aiva_common.utils import get_logger]
n7[logger = get_logger(__name__)]
n8[class HeaderConfiguration(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
143. scan aiva scan info gatherer init Module
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
flowchart TB
n1([開始])
n2([結束])
n1 --> n2
144. scan aiva scan info gatherer javascript source analyzer Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化分析器']
n4[self._sink_patterns = self._build_sink_pat...]
n5[self._source_patterns = self._build_source_p...]
n6[self._security_patterns = self._build_security...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化分析器&#39;]
n4[self._sink_patterns = self._build_sink_pat...]
n5[self._source_patterns = self._build_source_p...]
n6[self._security_patterns = self._build_security...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
145. scan aiva scan info gatherer javascript source analyzer Function analyze dataflow
flowchart TB
n1([開始])
n2([結束])
n3['\n 分析數據流(簡化版)\n\n 檢測用戶輸入源是否流向危...]
n4[source_lines = {p.line_number for p...]
n5{for sink in result.sinks}
n6[nearby_sources = [line for line in so...]
n7{if nearby_sources}
n8[sink.tainted_source = f'Potential taint fr...]
n9{if sink.severity == Severity.HIGH}
n10[sink.severity = Severity.HIGH]
n11[]
n12[]
n13[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n5
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 分析數據流(簡化版)\n\n 檢測用戶輸入源是否流向危...]
n4[source_lines = {p.line_number for p...]
n5{for sink in result.sinks}
n6[nearby_sources = [line for line in so...]
n7{if nearby_sources}
n8[sink.tainted_source = f&#39;Potential taint fr...]
n9{if sink.severity == Severity.HIGH}
n10[sink.severity = Severity.HIGH]
n11[]
n12[]
n13[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n5
n13 --> n2
146. scan aiva scan info gatherer javascript source analyzer Function build security patterns
flowchart TB
n1([開始])
n2([結束])
n3['構建安全問題檢測模式']
n4[return {PatternType.API_KEY: {'patt...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;構建安全問題檢測模式&#39;]
n4[return {PatternType.API_KEY: {&#39;patt...]
n1 --> n3
n3 --> n4
n4 --> n2
147. scan aiva scan info gatherer javascript source analyzer Function build sink patterns
flowchart TB
n1([開始])
n2([結束])
n3['構建 sink 檢測模式']
n4[return {SinkType.INNER_HTML: {'patt...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;構建 sink 檢測模式&#39;]
n4[return {SinkType.INNER_HTML: {&#39;patt...]
n1 --> n3
n3 --> n4
n4 --> n2
148. scan aiva scan info gatherer javascript source analyzer Function build source patterns
flowchart TB
n1([開始])
n2([結束])
n3['構建輸入源檢測模式']
n4[return {PatternType.URL_PARAMETER: {...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;構建輸入源檢測模式&#39;]
n4[return {PatternType.URL_PARAMETER: {&#3...]
n1 --> n3
n3 --> n4
n4 --> n2
149. scan aiva scan info gatherer javascript source analyzer Function count by type
flowchart TB
n1([開始])
n2([結束])
n3['按類型統計']
n4[counts: dict[str, int] = {}]
n5{for item in items}
n6{if isinstance(item, SinkMatch)}
n7[key = item.sink_type.value]
n8[key = item.pattern_type.va...]
n9[]
n10[counts[key] = counts.get(key, 0) +...]
n11[]
n12[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n9
n8 --> n9
n9 --> n10
n10 --> n5
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;按類型統計&#39;]
n4[counts: dict[str, int] = {}]
n5{for item in items}
n6{if isinstance(item, SinkMatch)}
n7[key = item.sink_type.value]
n8[key = item.pattern_type.va...]
n9[]
n10[counts[key] = counts.get(key, 0) +...]
n11[]
n12[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n9
n8 --> n9
n9 --> n10
n10 --> n5
n11 --> n12
n12 --> n2
150. scan aiva scan info gatherer javascript source analyzer Function detect patterns
flowchart TB
n1([開始])
n2([結束])
n3['檢測可疑模式']
n4[patterns: list[PatternMatch] = []]
n5{for (line_num, line) in enumerate(lines, ...}
n6[stripped = line.strip()]
n7{if not stripped or stripped.st...}
n8[continue]
n9[]
n10{for (source_type, pattern_info) in self._source_p...}
n11[pattern = pattern_info['patter...]
n12[severity = pattern_info['severi...]
n13[description = pattern_info['descri...]
n14[match = re.search(pattern, l...]
n15{if match}
n16[patterns.append(PatternMatch(pattern_type=source_...]
n17[]
n18[]
n19{for (security_type, pattern_info) in self._securi...}
n20[pattern = pattern_info['patter...]
n21[severity = pattern_info['severi...]
n22[description = pattern_info['descri...]
n23[match = re.search(pattern, l...]
n24{if match}
n25[patterns.append(PatternMatch(pattern_type=securit...]
n26[]
n27[]
n28[]
n29[return patterns]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n28
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n18
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n10
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n27
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 -->|Yes| n25
n24 -->|No| n26
n25 --> n26
n26 --> n19
n27 --> n5
n28 --> n29
n29 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;檢測可疑模式&#39;]
n4[patterns: list[PatternMatch] = []]
n5{for (line_num, line) in enumerate(lines, ...}
n6[stripped = line.strip()]
n7{if not stripped or stripped.st...}
n8[continue]
n9[]
n10{for (source_type, pattern_info) in self._source_p...}
n11[pattern = pattern_info[&#39;patter...]
n12[severity = pattern_info[&#39;severi...]
n13[description = pattern_info[&#39;descri...]
n14[match = re.search(pattern, l...]
n15{if match}
n16[patterns.append(PatternMatch(pattern_type=source_...]
n17[]
n18[]
n19{for (security_type, pattern_info) in self._securi...}
n20[pattern = pattern_info[&#39;patter...]
n21[severity = pattern_info[&#39;severi...]
n22[description = pattern_info[&#39;descri...]
n23[match = re.search(pattern, l...]
n24{if match}
n25[patterns.append(PatternMatch(pattern_type=securit...]
n26[]
n27[]
n28[]
n29[return patterns]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n28
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n18
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n10
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n27
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 -->|Yes| n25
n24 -->|No| n26
n25 --> n26
n26 --> n19
n27 --> n5
n28 --> n29
n29 --> n2
151. scan aiva scan info gatherer javascript source analyzer Function detect sinks
flowchart TB
n1([開始])
n2([結束])
n3['檢測危險 sinks']
n4[sinks: list[SinkMatch] = []]
n5{for (line_num, line) in enumerate(lines, ...}
n6[stripped = line.strip()]
n7{if not stripped or stripped.st...}
n8[continue]
n9[]
n10{for (sink_type, pattern_info) in self._sink_patte...}
n11[pattern = pattern_info['patter...]
n12[severity = pattern_info['severi...]
n13[description = pattern_info['descri...]
n14{if re.search(pattern, line, re...}
n15[context = self._extract_contex...]
n16[sinks.append(SinkMatch(sink_type=sink_type, line_...]
n17[]
n18[]
n19[]
n20[return sinks]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n19
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n18
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n17
n15 --> n16
n16 --> n17
n17 --> n10
n18 --> n5
n19 --> n20
n20 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;檢測危險 sinks&#39;]
n4[sinks: list[SinkMatch] = []]
n5{for (line_num, line) in enumerate(lines, ...}
n6[stripped = line.strip()]
n7{if not stripped or stripped.st...}
n8[continue]
n9[]
n10{for (sink_type, pattern_info) in self._sink_patte...}
n11[pattern = pattern_info[&#39;patter...]
n12[severity = pattern_info[&#39;severi...]
n13[description = pattern_info[&#39;descri...]
n14{if re.search(pattern, line, re...}
n15[context = self._extract_contex...]
n16[sinks.append(SinkMatch(sink_type=sink_type, line_...]
n17[]
n18[]
n19[]
n20[return sinks]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n19
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n18
n11 --> n12
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n17
n15 --> n16
n16 --> n17
n17 --> n10
n18 --> n5
n19 --> n20
n20 --> n2
152. scan aiva scan info gatherer javascript source analyzer Function extract context
flowchart TB
n1([開始])
n2([結束])
n3['提取代碼上下文']
n4[start = max(0, line_num - wi...]
n5[end = min(len(lines), line...]
n6[context_lines = lines[start:end]]
n7[return '\n'.join((f&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;提取代碼上下文&#39;]
n4[start = max(0, line_num - wi...]
n5[end = min(len(lines), line...]
n6[context_lines = lines[start:end]]
n7[return &#39;\n&#39;.join((f&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
153. scan aiva scan info gatherer javascript source analyzer Function analyze
flowchart TB
n1([開始])
n2([結束])
n3['\n 分析 JavaScript 源碼\n\n Args:\...]
n4[result = AnalysisResult(url=u...]
n5{if not source_code or not sour...}
n6[logger.debug('Empty source code provided&...]
n7[return result]
n8[]
n9[lines = source_code.split('\...]
n10[result.total_lines = len(lines)]
n11[result.sinks = self._detect_sinks(l...]
n12[result.patterns = self._detect_pattern...]
n13[self._analyze_dataflow(lines, result)]
n14[logger.info(f'Analysis complete: {le...]
n15[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 分析 JavaScript 源碼\n\n Args:\...]
n4[result = AnalysisResult(url=u...]
n5{if not source_code or not sour...}
n6[logger.debug(&#39;Empty source code provided&...]
n7[return result]
n8[]
n9[lines = source_code.split(&#39;\...]
n10[result.total_lines = len(lines)]
n11[result.sinks = self._detect_sinks(l...]
n12[result.patterns = self._detect_pattern...]
n13[self._analyze_dataflow(lines, result)]
n14[logger.info(f&#39;Analysis complete: {le...]
n15[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n2
154. scan aiva scan info gatherer javascript source analyzer Function format report
flowchart TB
n1([開始])
n2([結束])
n3['格式化報告']
n4[lines = []]
n5[lines.append('JavaScript Source Analysis ...]
n6[lines.append(f'URL: {result.url}...]
n7[lines.append('=' * 60)]
n8[stats = result.get_stats()]
n9[lines.append('\nStatistics:'&...]
n10[lines.append(f" Total Lines: {stats ...]
n11[lines.append(f" Total Sinks: {stats ...]
n12[lines.append(f" Total Patterns: {stats...]
n13[lines.append(f" Critical Issues: {stat...]
n14[lines.append(f" High Issues: {stats ...]
n15{if result.sinks}
n16[lines.append('\n' + &#...]
n17{for sink in result.sinks}
n18[lines.append(f'\n[{sink.severity...]
n19[lines.append(f' Line {sink.line_num...]
n20[lines.append(f' {sink.description...]
n21{if sink.tainted_source}
n22[lines.append(f' [警告] {sink...]
n23[]
n24[]
n25[]
n26{if result.patterns}
n27[lines.append('\n' + &#...]
n28{for pattern in result.patterns}
n29{if pattern.severity in [Severi...}
n30[lines.append(f'\n[{pattern.sever...]
n31[lines.append(f' Line {pattern.line_...]
n32[lines.append(f' {pattern.descriptio...]
n33[]
n34[]
n35[]
n36[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n25
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n24
n18 --> n19
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n23
n22 --> n23
n23 --> n17
n24 --> n25
n25 --> n26
n26 -->|Yes| n27
n26 -->|No| n35
n27 --> n28
n28 -->|Yes| n29
n28 -->|No| n34
n29 -->|Yes| n30
n29 -->|No| n33
n30 --> n31
n31 --> n32
n32 --> n33
n33 --> n28
n34 --> n35
n35 --> n36
n36 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;格式化報告&#39;]
n4[lines = []]
n5[lines.append(&#39;JavaScript Source Analysis ...]
n6[lines.append(f&#39;URL: {result.url}...]
n7[lines.append(&#39;=&#39; * 60)]
n8[stats = result.get_stats()]
n9[lines.append(&#39;\nStatistics:&#39;&...]
n10[lines.append(f&quot; Total Lines: {stats	...]
n11[lines.append(f&quot; Total Sinks: {stats	...]
n12[lines.append(f&quot; Total Patterns: {stats...]
n13[lines.append(f&quot; Critical Issues: {stat...]
n14[lines.append(f&quot; High Issues: {stats	...]
n15{if result.sinks}
n16[lines.append(&#39;\n&#39; + &#...]
n17{for sink in result.sinks}
n18[lines.append(f&#39;\n[{sink.severity...]
n19[lines.append(f&#39; Line {sink.line_num...]
n20[lines.append(f&#39; {sink.description&#...]
n21{if sink.tainted_source}
n22[lines.append(f&#39; [警告] {sink...]
n23[]
n24[]
n25[]
n26{if result.patterns}
n27[lines.append(&#39;\n&#39; + &#...]
n28{for pattern in result.patterns}
n29{if pattern.severity in [Severi...}
n30[lines.append(f&#39;\n[{pattern.sever...]
n31[lines.append(f&#39; Line {pattern.line_...]
n32[lines.append(f&#39; {pattern.descriptio...]
n33[]
n34[]
n35[]
n36[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n25
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n24
n18 --> n19
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n23
n22 --> n23
n23 --> n17
n24 --> n25
n25 --> n26
n26 -->|Yes| n27
n26 -->|No| n35
n27 --> n28
n28 -->|Yes| n29
n28 -->|No| n34
n29 -->|Yes| n30
n29 -->|No| n33
n30 --> n31
n31 --> n32
n32 --> n33
n33 --> n28
n34 --> n35
n35 --> n36
n36 --> n2
155. scan aiva scan info gatherer javascript source analyzer Function get high risk issues
flowchart TB
n1([開始])
n2([結束])
n3['獲取高風險問題']
n4[high_risk: list[SinkMatch | PatternMatch] = ...]
n5{for sink in result.sinks}
n6{if sink.severity in [Severity....}
n7[high_risk.append(sink)]
n8[]
n9[]
n10{for pattern in result.patterns}
n11{if pattern.severity in [Severi...}
n12[high_risk.append(pattern)]
n13[]
n14[]
n15[return high_risk]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n9
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n5
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n14
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n10
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取高風險問題&#39;]
n4[high_risk: list[SinkMatch | PatternMatch] = ...]
n5{for sink in result.sinks}
n6{if sink.severity in [Severity....}
n7[high_risk.append(sink)]
n8[]
n9[]
n10{for pattern in result.patterns}
n11{if pattern.severity in [Severi...}
n12[high_risk.append(pattern)]
n13[]
n14[]
n15[return high_risk]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n9
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n5
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n14
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n10
n14 --> n15
n15 --> n2
156. scan aiva scan info gatherer javascript source analyzer Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['獲取統計信息']
n4[return {'total_sinks': len...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取統計信息&#39;]
n4[return {&#39;total_sinks&#39;: len&#...]
n1 --> n3
n3 --> n4
n4 --> n2
157. scan aiva scan info gatherer javascript source analyzer Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[from enum import Enum]
n6[import re]
n7[from typing import Any]
n8[from services.aiva_common.enums import Severity]
n9[from services.aiva_common.utils import get_logger]
n10[logger = get_logger(__name__)]
n11[class SinkType(...)]
n12[class PatternType(...)]
n13[class SinkMatch(...)]
n14[class PatternMatch(...)]
n15[class AnalysisResult(...)]
n16[class JavaScriptSourceAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[from enum import Enum]
n6[import re]
n7[from typing import Any]
n8[from services.aiva_common.enums import Severity]
n9[from services.aiva_common.utils import get_logger]
n10[logger = get_logger(__name__)]
n11[class SinkType(...)]
n12[class PatternType(...)]
n13[class SinkMatch(...)]
n14[class PatternMatch(...)]
n15[class AnalysisResult(...)]
n16[class JavaScriptSourceAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
158. scan aiva scan info gatherer passive fingerprinter Function from headers
flowchart TB
n1([開始])
n2([結束])
n3[lower = {k.lower(): v for k,...]
n4[web_server = {'name': header...]
n5[framework = {'name': headers...]
n6[return Fingerprints(web_server=web_se...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[lower = {k.lower(): v for k,...]
n4[web_server = {&#39;name&#39;: header...]
n5[framework = {&#39;name&#39;: headers...]
n6[return Fingerprints(web_server=web_se...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
159. scan aiva scan info gatherer passive fingerprinter Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from services.aiva_common.schemas import Fingerpri...]
n5[class PassiveFingerprinter(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from services.aiva_common.schemas import Fingerpri...]
n5[class PassiveFingerprinter(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
160. scan aiva scan info gatherer sensitive info detector Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化檢測器\n\n Args:\n ...]
n4[self.min_severity = min_severity]
n5[self._patterns = self._build_patterns...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化檢測器\n\n Args:\n ...]
n4[self.min_severity = min_severity]
n5[self._patterns = self._build_patterns...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
161. scan aiva scan info gatherer sensitive info detector Function post init
flowchart TB
n1([開始])
n2([結束])
n3['自動設置描述和建議']
n4{if not self.description}
n5[self.description = self._get_default_de...]
n6[]
n7{if not self.recommendation}
n8[self.recommendation = self._get_default_re...]
n9[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;自動設置描述和建議&#39;]
n4{if not self.description}
n5[self.description = self._get_default_de...]
n6[]
n7{if not self.recommendation}
n8[self.recommendation = self._get_default_re...]
n9[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
162. scan aiva scan info gatherer sensitive info detector Function build patterns
flowchart TB
n1([開始])
n2([結束])
n3['構建檢測模式']
n4[return {SensitiveInfoType.API_KEY: {...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;構建檢測模式&#39;]
n4[return {SensitiveInfoType.API_KEY: {&#3...]
n1 --> n3
n3 --> n4
n4 --> n2
163. scan aiva scan info gatherer sensitive info detector Function count by location
flowchart TB
n1([開始])
n2([結束])
n3['按位置統計']
n4[counts: dict[str, int] = {}]
n5{for match in self.matches}
n6[key = match.location.value]
n7[counts[key] = counts.get(key, 0) +...]
n8[]
n9[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;按位置統計&#39;]
n4[counts: dict[str, int] = {}]
n5{for match in self.matches}
n6[key = match.location.value]
n7[counts[key] = counts.get(key, 0) +...]
n8[]
n9[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
164. scan aiva scan info gatherer sensitive info detector Function count by type
flowchart TB
n1([開始])
n2([結束])
n3['按類型統計']
n4[counts: dict[str, int] = {}]
n5{for match in self.matches}
n6[key = match.info_type.valu...]
n7[counts[key] = counts.get(key, 0) +...]
n8[]
n9[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;按類型統計&#39;]
n4[counts: dict[str, int] = {}]
n5{for match in self.matches}
n6[key = match.info_type.valu...]
n7[counts[key] = counts.get(key, 0) +...]
n8[]
n9[return counts]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
165. scan aiva scan info gatherer sensitive info detector Function detect html comments
flowchart TB
n1([開始])
n2([結束])
n3['檢測 HTML 註釋中的敏感信息']
n4[matches: list[SensitiveMatch] = []]
n5[comment_pattern = '<!--(.*?)--...]
n6{for comment_match in re.finditer(comme...}
n7[comment_text = comment_match.group(...]
n8{for match in self._detect_in_t...}
n9{if match.severity == Severity.LOW}
n10[match.severity = Severity.MEDIUM]
n11{if match.severity == Severity....}
n12[match.severity = Severity.HIGH]
n13[]
n14[]
n15[matches.append(match)]
n16[]
n17[]
n18[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n17
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n14
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n8
n16 --> n6
n17 --> n18
n18 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;檢測 HTML 註釋中的敏感信息&#39;]
n4[matches: list[SensitiveMatch] = []]
n5[comment_pattern = &#39;&lt;!--(.*?)--...]
n6{for comment_match in re.finditer(comme...}
n7[comment_text = comment_match.group(...]
n8{for match in self._detect_in_t...}
n9{if match.severity == Severity.LOW}
n10[match.severity = Severity.MEDIUM]
n11{if match.severity == Severity....}
n12[match.severity = Severity.HIGH]
n13[]
n14[]
n15[matches.append(match)]
n16[]
n17[]
n18[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n17
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n14
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n8
n16 --> n6
n17 --> n18
n18 --> n2
166. scan aiva scan info gatherer sensitive info detector Function detect in text
flowchart TB
n1([開始])
n2([結束])
n3['在文本中檢測敏感信息']
n4[matches: list[SensitiveMatch] = []]
n5[lines = text.split('\n')]
n6{for (line_num, line) in enumerate(lines, ...}
n7{for (info_type, pattern_info) in self._patterns.i...}
n8[pattern = pattern_info['patter...]
n9[severity = pattern_info['severi...]
n10{for regex_match in re.finditer(patte...}
n11[matched_value = regex_match.group(0)]
n12[start = max(0, regex_match.s...]
n13[end = min(len(line), regex...]
n14[context = line[start:end]]
n15[matches.append(SensitiveMatch(info_type=info_type...]
n16[]
n17[]
n18[]
n19[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n18
n7 -->|Yes| n8
n7 -->|No| n17
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n16
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n10
n16 --> n7
n17 --> n6
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;在文本中檢測敏感信息&#39;]
n4[matches: list[SensitiveMatch] = []]
n5[lines = text.split(&#39;\n&#39;)]
n6{for (line_num, line) in enumerate(lines, ...}
n7{for (info_type, pattern_info) in self._patterns.i...}
n8[pattern = pattern_info[&#39;patter...]
n9[severity = pattern_info[&#39;severi...]
n10{for regex_match in re.finditer(patte...}
n11[matched_value = regex_match.group(0)]
n12[start = max(0, regex_match.s...]
n13[end = min(len(line), regex...]
n14[context = line[start:end]]
n15[matches.append(SensitiveMatch(info_type=info_type...]
n16[]
n17[]
n18[]
n19[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n18
n7 -->|Yes| n8
n7 -->|No| n17
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n16
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n10
n16 --> n7
n17 --> n6
n18 --> n19
n19 --> n2
167. scan aiva scan info gatherer sensitive info detector Function detect meta tags
flowchart TB
n1([開始])
n2([結束])
n3['檢測 meta 標籤中的敏感信息']
n4[matches: list[SensitiveMatch] = []]
n5[meta_pattern = '<meta[^> ...]
n6{for meta_match in re.finditer(meta_...}
n7[content = meta_match.group(1)]
n8{for match in self._detect_in_t...}
n9[matches.append(match)]
n10[]
n11[]
n12[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n6
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;檢測 meta 標籤中的敏感信息&#39;]
n4[matches: list[SensitiveMatch] = []]
n5[meta_pattern = &#39;&lt;meta[^&gt;	...]
n6{for meta_match in re.finditer(meta_...}
n7[content = meta_match.group(1)]
n8{for match in self._detect_in_t...}
n9[matches.append(match)]
n10[]
n11[]
n12[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n6
n11 --> n12
n12 --> n2
168. scan aiva scan info gatherer sensitive info detector Function detect script blocks
flowchart TB
n1([開始])
n2([結束])
n3['檢測 <script> 標籤中的敏感信息']
n4[matches: list[SensitiveMatch] = []]
n5[script_pattern = '<script[^>...]
n6{for script_match in re.finditer(scrip...}
n7[script_text = script_match.group(1...]
n8{for match in self._detect_in_t...}
n9[matches.append(match)]
n10[]
n11[]
n12[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n6
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;檢測 &lt;script&gt; 標籤中的敏感信息&#39;]
n4[matches: list[SensitiveMatch] = []]
n5[script_pattern = &#39;&lt;script[^&gt...]
n6{for script_match in re.finditer(scrip...}
n7[script_text = script_match.group(1...]
n8{for match in self._detect_in_t...}
n9[matches.append(match)]
n10[]
n11[]
n12[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n6
n11 --> n12
n12 --> n2
169. scan aiva scan info gatherer sensitive info detector Function filter by severity
flowchart TB
n1([開始])
n2([結束])
n3['根據最低嚴重程度過濾匹配']
n4[severity_order = {Severity.INFORMATIO...]
n5[min_level = severity_order[self....]
n6[return [m for m in matches if severit...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;根據最低嚴重程度過濾匹配&#39;]
n4[severity_order = {Severity.INFORMATIO...]
n5[min_level = severity_order[self....]
n6[return [m for m in matches if severit...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
170. scan aiva scan info gatherer sensitive info detector Function get default description
flowchart TB
n1([開始])
n2([結束])
n3['獲取默認描述']
n4[descriptions = {SensitiveInfoType.A...]
n5[return descriptions.get(self.info_typ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取默認描述&#39;]
n4[descriptions = {SensitiveInfoType.A...]
n5[return descriptions.get(self.info_typ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
171. scan aiva scan info gatherer sensitive info detector Function get default recommendation
flowchart TB
n1([開始])
n2([結束])
n3['獲取默認建議']
n4{if self.info_type in [Sensitiv...}
n5[return 'Remove credentials from clien...]
n6{if self.info_type in [Sensitiv...}
n7[return 'Mask or remove personal infor...]
n8{if self.info_type in [Sensitiv...}
n9[return 'Disable debug mode in product...]
n10{if self.info_type == Sensitive...}
n11[return 'Remove internal file paths fr...]
n12[return 'Review and remove sensitive i...]
n13[]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n16
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n15
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n14
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取默認建議&#39;]
n4{if self.info_type in [Sensitiv...}
n5[return &#39;Remove credentials from clien...]
n6{if self.info_type in [Sensitiv...}
n7[return &#39;Mask or remove personal infor...]
n8{if self.info_type in [Sensitiv...}
n9[return &#39;Disable debug mode in product...]
n10{if self.info_type == Sensitive...}
n11[return &#39;Remove internal file paths fr...]
n12[return &#39;Review and remove sensitive i...]
n13[]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n16
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n15
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n14
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
172. scan aiva scan info gatherer sensitive info detector Function detect in headers
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測 HTTP 響應頭中的敏感信息\n\n Args:...]
n4[result = DetectionResult(url=...]
n5{if not headers}
n6[return result]
n7[]
n8{for (header_name, header_value) in headers.items&...}
n9{if header_name.lower() == 'set...}
n10[result.matches.append(SensitiveMatch(info_type=Se...]
n11[]
n12[combined = f'{header_name}: {h...]
n13{for match in self._detect_in_t...}
n14[result.matches.append(match)]
n15[]
n16[]
n17[result.matches = self._filter_by_seve...]
n18[logger.info(f'Headers detection complete:...]
n19[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n13
n15 --> n8
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測 HTTP 響應頭中的敏感信息\n\n Args:...]
n4[result = DetectionResult(url=...]
n5{if not headers}
n6[return result]
n7[]
n8{for (header_name, header_value) in headers.items&...}
n9{if header_name.lower() == &#39;set...}
n10[result.matches.append(SensitiveMatch(info_type=Se...]
n11[]
n12[combined = f&#39;{header_name}: {h...]
n13{for match in self._detect_in_t...}
n14[result.matches.append(match)]
n15[]
n16[]
n17[result.matches = self._filter_by_seve...]
n18[logger.info(f&#39;Headers detection complete:...]
n19[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n13
n15 --> n8
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
173. scan aiva scan info gatherer sensitive info detector Function detect in html
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測 HTML 內容中的敏感信息\n\n Args:\...]
n4[result = DetectionResult(url=...]
n5{if not html_content}
n6[return result]
n7[]
n8[result.matches.extend(self._detect_html_comments(...]
n9[result.matches.extend(self._detect_script_blocks(...]
n10[result.matches.extend(self._detect_meta_tags(html...]
n11[result.matches.extend(self._detect_in_text(html_c...]
n12[result.matches = self._filter_by_seve...]
n13[logger.info(f'HTML detection complete: ...]
n14[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測 HTML 內容中的敏感信息\n\n Args:\...]
n4[result = DetectionResult(url=...]
n5{if not html_content}
n6[return result]
n7[]
n8[result.matches.extend(self._detect_html_comments(...]
n9[result.matches.extend(self._detect_script_blocks(...]
n10[result.matches.extend(self._detect_meta_tags(html...]
n11[result.matches.extend(self._detect_in_text(html_c...]
n12[result.matches = self._filter_by_seve...]
n13[logger.info(f&#39;HTML detection complete: &#...]
n14[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
174. scan aiva scan info gatherer sensitive info detector Function detect in javascript
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測 JavaScript 代碼中的敏感信息\n\n ...]
n4[result = DetectionResult(url=...]
n5{if not js_code}
n6[return result]
n7[]
n8[result.matches = self._detect_in_text...]
n9[result.matches = self._filter_by_seve...]
n10[logger.info(f'JavaScript detection comple...]
n11[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測 JavaScript 代碼中的敏感信息\n\n ...]
n4[result = DetectionResult(url=...]
n5{if not js_code}
n6[return result]
n7[]
n8[result.matches = self._detect_in_text...]
n9[result.matches = self._filter_by_seve...]
n10[logger.info(f&#39;JavaScript detection comple...]
n11[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
175. scan aiva scan info gatherer sensitive info detector Function detect in response
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測完整的 HTTP 響應\n\n Args:\n ...]
n4[result = DetectionResult(url=...]
n5{if response_body}
n6{if '<html' in response_bod...}
n7[html_result = self.detect_in_html(...]
n8[result.matches.extend(html_result.matches)]
n9[body_matches = self._detect_in_text...]
n10[result.matches.extend(body_matches)]
n11[]
n12[]
n13{if headers}
n14[header_result = self.detect_in_heade...]
n15[result.matches.extend(header_result.matches)]
n16[]
n17[result.matches = self._filter_by_seve...]
n18[logger.info(f'Response detection complete...]
n19[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n11
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n16
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測完整的 HTTP 響應\n\n Args:\n ...]
n4[result = DetectionResult(url=...]
n5{if response_body}
n6{if &#39;&lt;html&#39; in response_bod...}
n7[html_result = self.detect_in_html(...]
n8[result.matches.extend(html_result.matches)]
n9[body_matches = self._detect_in_text...]
n10[result.matches.extend(body_matches)]
n11[]
n12[]
n13{if headers}
n14[header_result = self.detect_in_heade...]
n15[result.matches.extend(header_result.matches)]
n16[]
n17[result.matches = self._filter_by_seve...]
n18[logger.info(f&#39;Response detection complete...]
n19[return result]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 -->|Yes| n7
n6 -->|No| n9
n7 --> n8
n8 --> n11
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n16
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
176. scan aiva scan info gatherer sensitive info detector Function format report
flowchart TB
n1([開始])
n2([結束])
n3['格式化檢測報告']
n4[lines = []]
n5[lines.append('Sensitive Information Detec...]
n6[lines.append(f'URL: {result.url}...]
n7[lines.append('=' * 70)]
n8[stats = result.get_stats()]
n9[lines.append('\nStatistics:'&...]
n10[lines.append(f" Total Matches: {stats&...]
n11[lines.append(f" Critical Issues: {stat...]
n12[lines.append(f" High Issues: {stats ...]
n13{if stats['matches_by_type']}
n14[lines.append('\n Matches by Type:&...]
n15{for (info_type, count) in stats['...}
n16[lines.append(f' - {info_type}...]
n17[]
n18[]
n19{if result.matches}
n20[lines.append('\n' + &#...]
n21[sorted_matches = sorted(result.matche...]
n22{for match in sorted_matches}
n23[lines.append(f'\n[{match.severit...]
n24[lines.append(f' Location: {match.lo...]
n25{if match.line_number}
n26[lines.append(f' Line: {match.line_n...]
n27[]
n28[lines.append(f' Value: {match.value...]
n29[lines.append(f' Context: {match.con...]
n30[lines.append(f' Description: {match...]
n31[lines.append(f' Recommendation: {ma...]
n32[]
n33[]
n34[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n18
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n15
n17 --> n18
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n33
n20 --> n21
n21 --> n22
n22 -->|Yes| n23
n22 -->|No| n32
n23 --> n24
n24 --> n25
n25 -->|Yes| n26
n25 -->|No| n27
n26 --> n27
n27 --> n28
n28 --> n29
n29 --> n30
n30 --> n31
n31 --> n22
n32 --> n33
n33 --> n34
n34 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;格式化檢測報告&#39;]
n4[lines = []]
n5[lines.append(&#39;Sensitive Information Detec...]
n6[lines.append(f&#39;URL: {result.url}...]
n7[lines.append(&#39;=&#39; * 70)]
n8[stats = result.get_stats()]
n9[lines.append(&#39;\nStatistics:&#39;&...]
n10[lines.append(f&quot; Total Matches: {stats&...]
n11[lines.append(f&quot; Critical Issues: {stat...]
n12[lines.append(f&quot; High Issues: {stats	...]
n13{if stats[&#39;matches_by_type&#39;]}
n14[lines.append(&#39;\n Matches by Type:&&#...]
n15{for (info_type, count) in stats[&#39;...}
n16[lines.append(f&#39; - {info_type}...]
n17[]
n18[]
n19{if result.matches}
n20[lines.append(&#39;\n&#39; + &#...]
n21[sorted_matches = sorted(result.matche...]
n22{for match in sorted_matches}
n23[lines.append(f&#39;\n[{match.severit...]
n24[lines.append(f&#39; Location: {match.lo...]
n25{if match.line_number}
n26[lines.append(f&#39; Line: {match.line_n...]
n27[]
n28[lines.append(f&#39; Value: {match.value...]
n29[lines.append(f&#39; Context: {match.con...]
n30[lines.append(f&#39; Description: {match...]
n31[lines.append(f&#39; Recommendation: {ma...]
n32[]
n33[]
n34[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n18
n14 --> n15
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n15
n17 --> n18
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n33
n20 --> n21
n21 --> n22
n22 -->|Yes| n23
n22 -->|No| n32
n23 --> n24
n24 --> n25
n25 -->|Yes| n26
n25 -->|No| n27
n26 --> n27
n27 --> n28
n28 --> n29
n29 --> n30
n30 --> n31
n31 --> n22
n32 --> n33
n33 --> n34
n34 --> n2
177. scan aiva scan info gatherer sensitive info detector Function get critical issues
flowchart TB
n1([開始])
n2([結束])
n3['獲取關鍵問題']
n4[return [m for m in result.matches if ...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取關鍵問題&#39;]
n4[return [m for m in result.matches if ...]
n1 --> n3
n3 --> n4
n4 --> n2
178. scan aiva scan info gatherer sensitive info detector Function get high risk issues
flowchart TB
n1([開始])
n2([結束])
n3['獲取高風險問題']
n4[return [m for m in result.matches if ...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取高風險問題&#39;]
n4[return [m for m in result.matches if ...]
n1 --> n3
n3 --> n4
n4 --> n2
179. scan aiva scan info gatherer sensitive info detector Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['獲取統計信息']
n4[return {'total_matches': len...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取統計信息&#39;]
n4[return {&#39;total_matches&#39;: len...]
n1 --> n3
n3 --> n4
n4 --> n2
180. scan aiva scan info gatherer sensitive info detector Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Location, S...]
n8[from services.aiva_common.utils import get_logger]
n9[logger = get_logger(__name__)]
n10[class SensitiveMatch(...)]
n11[class DetectionResult(...)]
n12[class SensitiveInfoDetector(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass, field]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Location, S...]
n8[from services.aiva_common.utils import get_logger]
n9[logger = get_logger(__name__)]
n10[class SensitiveMatch(...)]
n11[class DetectionResult(...)]
n12[class SensitiveInfoDetector(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n2
181. scan aiva scan javascript analyzer Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化 JavaScript 分析器']
n4[self.analysis_results: list[JavaScriptAnalysisResu...]
n5[logger.debug('JavaScriptAnalyzer initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化 JavaScript 分析器&#39;]
n4[self.analysis_results: list[JavaScriptAnalysisResu...]
n5[logger.debug(&#39;JavaScriptAnalyzer initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
182. scan aiva scan javascript analyzer Function calculate security score
flowchart TB
n1([開始])
n2([結束])
n3['\n 計算安全分數(0-100)\n\n Args:\n ...]
n4[score = 100]
n5[score -= len(result.dangerous_functions) * 10]
n6{for leak in result.data_leaks}
n7[severity = leak.get('severity'...]
n8{if severity == 'critical'}
n9[score -= 25]
n10{if severity == 'high'}
n11[score -= 15]
n12{if severity == 'medium'}
n13[score -= 10]
n14[score -= 5]
n15[]
n16[]
n17[]
n18[]
n19{if len(result.external_resourc...}
n20[score -= 5]
n21[]
n22[return max(0, min(100, score))]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n18
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n17
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n16
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n15
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n6
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n21
n20 --> n21
n21 --> n22
n22 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 計算安全分數(0-100)\n\n Args:\n ...]
n4[score = 100]
n5[score -= len(result.dangerous_functions) * 10]
n6{for leak in result.data_leaks}
n7[severity = leak.get(&#39;severity&#39...]
n8{if severity == &#39;critical&#39;}
n9[score -= 25]
n10{if severity == &#39;high&#39;}
n11[score -= 15]
n12{if severity == &#39;medium&#39;}
n13[score -= 10]
n14[score -= 5]
n15[]
n16[]
n17[]
n18[]
n19{if len(result.external_resourc...}
n20[score -= 5]
n21[]
n22[return max(0, min(100, score))]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n18
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n17
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n16
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n15
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n6
n18 --> n19
n19 -->|Yes| n20
n19 -->|No| n21
n20 --> n21
n21 --> n22
n22 --> n2
183. scan aiva scan javascript analyzer Function detect dangerous functions
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測危險的 JavaScript 函數調用\n\n A...]
n4[dangerous_patterns = {'eval'...]
n5[detected: list[str] = []]
n6{for (func_name, pattern) in dangerous_pattern...}
n7{if re.search(pattern, js_conte...}
n8[detected.append(func_name)]
n9[logger.warning(f'Dangerous function detec...]
n10[]
n11[]
n12[return detected]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 -->|Yes| n8
n7 -->|No| n10
n8 --> n9
n9 --> n10
n10 --> n6
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測危險的 JavaScript 函數調用\n\n A...]
n4[dangerous_patterns = {&#39;eval&#39;...]
n5[detected: list[str] = []]
n6{for (func_name, pattern) in dangerous_pattern...}
n7{if re.search(pattern, js_conte...}
n8[detected.append(func_name)]
n9[logger.warning(f&#39;Dangerous function detec...]
n10[]
n11[]
n12[return detected]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 -->|Yes| n8
n7 -->|No| n10
n8 --> n9
n9 --> n10
n10 --> n6
n11 --> n12
n12 --> n2
184. scan aiva scan javascript analyzer Function detect data leaks
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢測可能的數據洩漏\n\n Args:\n ...]
n4[leaks: list[dict[str, str]] = []]
n5[console_pattern = 'console\\.(log|de...]
n6[console_matches = re.finditer(console_...]
n7{if any(console_matches)}
n8[leaks.append({'type': &a...]
n9[]
n10[storage_pattern = '(localStorage|ses...]
n11[storage_matches = re.finditer(storage_...]
n12{if any(storage_matches)}
n13[leaks.append({'type': &a...]
n14[]
n15[url_param_pattern = '[?&](pas...]
n16[url_param_matches = re.finditer(url_para...]
n17{if any(url_param_matches)}
n18[leaks.append({'type': &a...]
n19[]
n20[hardcoded_pattern = '(password|apiKe...]
n21[hardcoded_matches = re.finditer(hardcode...]
n22{if any(hardcoded_matches)}
n23[leaks.append({'type': &a...]
n24[]
n25[logger.debug(f'Detected {len(lea...]
n26[return leaks]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n19
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 -->|Yes| n23
n22 -->|No| n24
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢測可能的數據洩漏\n\n Args:\n ...]
n4[leaks: list[dict[str, str]] = []]
n5[console_pattern = &#39;console\\.(log|de...]
n6[console_matches = re.finditer(console_...]
n7{if any(console_matches)}
n8[leaks.append({&#39;type&#39;: &a...]
n9[]
n10[storage_pattern = &#39;(localStorage|ses...]
n11[storage_matches = re.finditer(storage_...]
n12{if any(storage_matches)}
n13[leaks.append({&#39;type&#39;: &a...]
n14[]
n15[url_param_pattern = &#39;[?&](pas...]
n16[url_param_matches = re.finditer(url_para...]
n17{if any(url_param_matches)}
n18[leaks.append({&#39;type&#39;: &a...]
n19[]
n20[hardcoded_pattern = &#39;(password|apiKe...]
n21[hardcoded_matches = re.finditer(hardcode...]
n22{if any(hardcoded_matches)}
n23[leaks.append({&#39;type&#39;: &a...]
n24[]
n25[logger.debug(f&#39;Detected {len(lea...]
n26[return leaks]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 -->|Yes| n18
n17 -->|No| n19
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 -->|Yes| n23
n22 -->|No| n24
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n2
185. scan aiva scan javascript analyzer Function extract external resources
flowchart TB
n1([開始])
n2([結束])
n3['\n 提取 JavaScript 中引用的外部資源\n\n ...]
n4[external_urls: list[str] = []]
n5[url_pattern = 'https?://[^\\s\\\&#...]
n6[matches = re.finditer(url_patt...]
n7{for match in matches}
n8[url = match.group(0)]
n9{if url not in external_urls}
n10[external_urls.append(url)]
n11[]
n12[]
n13[logger.debug(f'Found {len(extern...]
n14[return external_urls]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n7
n12 --> n13
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 提取 JavaScript 中引用的外部資源\n\n ...]
n4[external_urls: list[str] = []]
n5[url_pattern = &#39;https?://[^\\s\\\&#...]
n6[matches = re.finditer(url_patt...]
n7{for match in matches}
n8[url = match.group(0)]
n9{if url not in external_urls}
n10[external_urls.append(url)]
n11[]
n12[]
n13[logger.debug(f&#39;Found {len(extern...]
n14[return external_urls]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n7
n12 --> n13
n13 --> n14
n14 --> n2
186. scan aiva scan javascript analyzer Function clear results
flowchart TB
n1([開始])
n2([結束])
n3['清空所有分析結果']
n4[self.analysis_results.clear()]
n5[logger.debug('Cleared all JavaScript anal...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空所有分析結果&#39;]
n4[self.analysis_results.clear()]
n5[logger.debug(&#39;Cleared all JavaScript anal...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
187. scan aiva scan javascript analyzer Function get all results
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取所有分析結果\n\n Returns:\n ...]
n4[return self.analysis_results.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取所有分析結果\n\n Returns:\n ...]
n4[return self.analysis_results.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
188. scan aiva scan javascript analyzer Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取統計信息\n\n Returns:\n ...]
n4{if not self.analysis_results}
n5[return {'total_files': 0, &a...]
n6[]
n7[total_score = sum((r.security_scor...]
n8[total_dangerous = sum((len(r.dangerous...]
n9[total_leaks = sum((len(r.data_leak...]
n10[return {'total_files': len...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取統計信息\n\n Returns:\n ...]
n4{if not self.analysis_results}
n5[return {&#39;total_files&#39;: 0, &a...]
n6[]
n7[total_score = sum((r.security_scor...]
n8[total_dangerous = sum((len(r.dangerous...]
n9[total_leaks = sum((len(r.data_leak...]
n10[return {&#39;total_files&#39;: len&#...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
189. scan aiva scan javascript analyzer Module
flowchart TB
n1([開始])
n2([結束])
n3['\nJavaScript 代碼分析器\n靜態分析 JavaScript 代碼以識別潛在的...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.schemas import JavaScrip...]
n8[from services.aiva_common.utils import get_logger,...]
n9[logger = get_logger(__name__)]
n10[class JavaScriptAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nJavaScript 代碼分析器\n靜態分析 JavaScript 代碼以識別潛在的...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.schemas import JavaScrip...]
n8[from services.aiva_common.utils import get_logger,...]
n9[logger = get_logger(__name__)]
n10[class JavaScriptAnalyzer(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
190. scan aiva scan scan context Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化掃描上下文\n\n Args:\n ...]
n4[self.request = request]
n5[self._start_time = time.time()]
n6[self.assets: list[Asset] = []]
n7[self.urls_found = 0]
n8[self.forms_found = 0]
n9[self.apis_found = 0]
n10[self.pages_crawled = 0]
n11[self.fingerprints: Fingerprints | None = None]
n12[self.errors: list[dict[str, str]] = [...]
n13[logger.debug(f'Scan context initialized f...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化掃描上下文\n\n Args:\n ...]
n4[self.request = request]
n5[self._start_time = time.time()]
n6[self.assets: list[Asset] = []]
n7[self.urls_found = 0]
n8[self.forms_found = 0]
n9[self.apis_found = 0]
n10[self.pages_crawled = 0]
n11[self.fingerprints: Fingerprints | None = None]
n12[self.errors: list[dict[str, str]] = [...]
n13[logger.debug(f&#39;Scan context initialized f...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
191. scan aiva scan scan context Function repr
flowchart TB
n1([開始])
n2([結束])
n3['返回上下文的字符串表示']
n4[stats = self.get_statistics(...]
n5[return f"ScanContext(scan_id={self.re...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;返回上下文的字符串表示&#39;]
n4[stats = self.get_statistics(...]
n5[return f&quot;ScanContext(scan_id={self.re...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
192. scan aiva scan scan context Function add asset
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加資產到收集列表\n\n Args:\n ...]
n4[self.assets.append(asset)]
n5[logger.debug(f'Asset added: {asset.t...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加資產到收集列表\n\n Args:\n ...]
n4[self.assets.append(asset)]
n5[logger.debug(f&#39;Asset added: {asset.t...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
193. scan aiva scan scan context Function add error
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄錯誤信息\n\n Args:\n ...]
n4[error_info = {'type': error_...]
n5{if url}
n6[error_info['url'] = url]
n7[]
n8[self.errors.append(error_info)]
n9[logger.warning(f'Error recorded: {er...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄錯誤信息\n\n Args:\n ...]
n4[error_info = {&#39;type&#39;: error_...]
n5{if url}
n6[error_info[&#39;url&#39;] = url]
n7[]
n8[self.errors.append(error_info)]
n9[logger.warning(f&#39;Error recorded: {er...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
194. scan aiva scan scan context Function add forms found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的表單計數\n\n Args:\n ...]
n4[self.forms_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的表單計數\n\n Args:\n ...]
n4[self.forms_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
195. scan aiva scan scan context Function add js analysis result
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄 JavaScript 分析結果\n\n Args...]
n4{if not hasattr(self, 'js_analy...}
n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
n6[]
n7[self.js_analysis_results.append(result)]
n8[logger.debug(f'JS analysis result recorde...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄 JavaScript 分析結果\n\n Args...]
n4{if not hasattr(self, &#39;js_analy...}
n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
n6[]
n7[self.js_analysis_results.append(result)]
n8[logger.debug(f&#39;JS analysis result recorde...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
196. scan aiva scan scan context Function add sensitive match
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄發現的敏感資料匹配\n\n Args:\n ...]
n4{if not hasattr(self, 'sensitiv...}
n5[self.sensitive_matches: list[SensitiveMatch] = ...]
n6[]
n7[self.sensitive_matches.append(match)]
n8[logger.info(f"Sensitive match recorded: ...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄發現的敏感資料匹配\n\n Args:\n ...]
n4{if not hasattr(self, &#39;sensitiv...}
n5[self.sensitive_matches: list[SensitiveMatch] = &#...]
n6[]
n7[self.sensitive_matches.append(match)]
n8[logger.info(f&quot;Sensitive match recorded: ...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
197. scan aiva scan scan context Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取當前統計信息\n\n Returns:\n ...]
n4[return {'urls_found': self.u...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取當前統計信息\n\n Returns:\n ...]
n4[return {&#39;urls_found&#39;: self.u...]
n1 --> n3
n3 --> n4
n4 --> n2
198. scan aiva scan scan context Function increment apis found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的 API 計數\n\n Args:\n ...]
n4[self.apis_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的 API 計數\n\n Args:\n ...]
n4[self.apis_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
199. scan aiva scan scan context Function increment pages crawled
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加已爬取頁面計數\n\n Args:\n ...]
n4[self.pages_crawled += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加已爬取頁面計數\n\n Args:\n ...]
n4[self.pages_crawled += count]
n1 --> n3
n3 --> n4
n4 --> n2
200. scan aiva scan scan context Function increment urls found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的 URL 計數\n\n Args:\n ...]
n4[self.urls_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的 URL 計數\n\n Args:\n ...]
n4[self.urls_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
201. scan aiva scan scan context Function reset statistics
flowchart TB
n1([開始])
n2([結束])
n3['重置所有統計計數器']
n4[self.urls_found = 0]
n5[self.forms_found = 0]
n6[self.apis_found = 0]
n7[self.pages_crawled = 0]
n8[logger.debug('Statistics reset...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置所有統計計數器&#39;]
n4[self.urls_found = 0]
n5[self.forms_found = 0]
n6[self.apis_found = 0]
n7[self.pages_crawled = 0]
n8[logger.debug(&#39;Statistics reset&#3...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
202. scan aiva scan scan context Function scan duration
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取掃描持續時間(秒)\n\n Returns:\n ...]
n4[return int(time.time() - self._start_...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取掃描持續時間(秒)\n\n Returns:\n ...]
n4[return int(time.time() - self._start_...]
n1 --> n3
n3 --> n4
n4 --> n2
203. scan aiva scan scan context Function set fingerprints
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置指紋信息\n\n Args:\n ...]
n4[self.fingerprints = fingerprints]
n5[logger.debug('Fingerprints set...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置指紋信息\n\n Args:\n ...]
n4[self.fingerprints = fingerprints]
n5[logger.debug(&#39;Fingerprints set&#3...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
204. scan aiva scan scan context Module
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n']
n4[from __future__ import annotations]
n5[import time]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import Asset, Fi...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[pass]
n11[]
n12[logger = get_logger(__name__)]
n13[class ScanContext(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n&#39;]
n4[from __future__ import annotations]
n5[import time]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import Asset, Fi...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[pass]
n11[]
n12[logger = get_logger(__name__)]
n13[class ScanContext(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
205. scan aiva scan scan orchestrator Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化掃描編排器']
n4[self.static_parser = StaticContentParser(...]
n5[self.fingerprint_collector = FingerprintCollector...]
n6[self.sensitive_detector = SensitiveInfoDetecto...]
n7[self.js_analyzer = JavaScriptSourceAnal...]
n8[self.browser_pool: HeadlessBrowserPool | None = No...]
n9[self.dynamic_extractor: DynamicContentExtractor | ...]
n10[logger.info('ScanOrchestrator initialized...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化掃描編排器&#39;]
n4[self.static_parser = StaticContentParser(...]
n5[self.fingerprint_collector = FingerprintCollector...]
n6[self.sensitive_detector = SensitiveInfoDetecto...]
n7[self.js_analyzer = JavaScriptSourceAnal...]
n8[self.browser_pool: HeadlessBrowserPool | None = No...]
n9[self.dynamic_extractor: DynamicContentExtractor | ...]
n10[logger.info(&#39;ScanOrchestrator initialized...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
206. scan aiva scan scan orchestrator Function build scan result
flowchart TB
n1([開始])
n2([結束])
n3['\n 構建掃描結果\n\n Args:\n ...]
n4[summary = Summary(urls_found=c...]
n5[return ScanCompletedPayload(scan_id=c...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 構建掃描結果\n\n Args:\n ...]
n4[summary = Summary(urls_found=c...]
n5[return ScanCompletedPayload(scan_id=c...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
207. scan aiva scan scan orchestrator Function reset
flowchart TB
n1([開始])
n2([結束])
n3['重置編排器狀態']
n4[self.fingerprint_collector.reset()]
n5[logger.info('ScanOrchestrator reset&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置編排器狀態&#39;]
n4[self.fingerprint_collector.reset()]
n5[logger.info(&#39;ScanOrchestrator reset&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
208. scan aiva scan scan orchestrator Module
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n']
n4[from __future__ import annotations]
n5[from typing import TYPE_CHECKING, Any]
n6[from services.aiva_common.schemas import Asset, Sc...]
n7[from services.aiva_common.utils import get_logger,...]
n8[from .authentication_manager import Authentication...]
n9[from .core_crawling_engine.http_client_hi import H...]
n10[from .core_crawling_engine.static_content_parser i...]
n11[from .core_crawling_engine.url_queue_manager impor...]
n12[from .dynamic_engine.dynamic_content_extractor imp...]
n13[from .dynamic_engine.headless_browser_pool import ...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[from .info_gatherer.javascript_source_analyzer imp...]
n17[from .info_gatherer.sensitive_info_detector import...]
n18[from .scan_context import ScanContext]
n19[from .strategy_controller import StrategyControlle...]
n20{if TYPE_CHECKING}
n21[pass]
n22[]
n23[logger = get_logger(__name__)]
n24[class ScanOrchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n掃描編排器 - 統一管理掃描流程的核心邏輯\n&#39;]
n4[from __future__ import annotations]
n5[from typing import TYPE_CHECKING, Any]
n6[from services.aiva_common.schemas import Asset, Sc...]
n7[from services.aiva_common.utils import get_logger,...]
n8[from .authentication_manager import Authentication...]
n9[from .core_crawling_engine.http_client_hi import H...]
n10[from .core_crawling_engine.static_content_parser i...]
n11[from .core_crawling_engine.url_queue_manager impor...]
n12[from .dynamic_engine.dynamic_content_extractor imp...]
n13[from .dynamic_engine.headless_browser_pool import ...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[from .info_gatherer.javascript_source_analyzer imp...]
n17[from .info_gatherer.sensitive_info_detector import...]
n18[from .scan_context import ScanContext]
n19[from .strategy_controller import StrategyControlle...]
n20{if TYPE_CHECKING}
n21[pass]
n22[]
n23[logger = get_logger(__name__)]
n24[class ScanOrchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
209. scan aiva scan schemas Function init
flowchart TB
n1([開始])
n2([結束])
n3[super().__init__(**data)]
n4{if not self.description}
n5[self.description = self._get_default_de...]
n6[]
n7{if not self.recommendation}
n8[self.recommendation = self._get_default_re...]
n9[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[super().__init__(**data)]
n4{if not self.description}
n5[self.description = self._get_default_de...]
n6[]
n7{if not self.recommendation}
n8[self.recommendation = self._get_default_re...]
n9[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n2
210. scan aiva scan schemas Function get default description
flowchart TB
n1([開始])
n2([結束])
n3['獲取默認描述']
n4[descriptions = {SensitiveInfoType.A...]
n5[return descriptions.get(self.info_typ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取默認描述&#39;]
n4[descriptions = {SensitiveInfoType.A...]
n5[return descriptions.get(self.info_typ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
211. scan aiva scan schemas Function get default recommendation
flowchart TB
n1([開始])
n2([結束])
n3['獲取默認建議']
n4{if self.info_type in [Sensitiv...}
n5[return 'Remove credentials from clien...]
n6{if self.info_type in [Sensitiv...}
n7[return 'Mask or remove personal infor...]
n8{if self.info_type in [Sensitiv...}
n9[return 'Disable debug mode in product...]
n10{if self.info_type == Sensitive...}
n11[return 'Remove internal file paths fr...]
n12[return f'Remove {self.info_type.value...]
n13[]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n16
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n15
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n14
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取默認建議&#39;]
n4{if self.info_type in [Sensitiv...}
n5[return &#39;Remove credentials from clien...]
n6{if self.info_type in [Sensitiv...}
n7[return &#39;Mask or remove personal infor...]
n8{if self.info_type in [Sensitiv...}
n9[return &#39;Disable debug mode in product...]
n10{if self.info_type == Sensitive...}
n11[return &#39;Remove internal file paths fr...]
n12[return f&#39;Remove {self.info_type.value...]
n13[]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n16
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n15
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n14
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
212. scan aiva scan schemas Function limit list size
flowchart TB
n1([開始])
n2([結束])
n3['限制列表大小以防止過大的響應']
n4[max_items = 1000]
n5{if len(v) > max_items}
n6[raise ValueError(f'List too large (ma...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;限制列表大小以防止過大的響應&#39;]
n4[max_items = 1000]
n5{if len(v) &gt; max_items}
n6[raise ValueError(f&#39;List too large (ma...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
213. scan aiva scan schemas Function limit urls
flowchart TB
n1([開始])
n2([結束])
n3['限制 URL 數量']
n4[max_urls = 500]
n5{if len(v) > max_urls}
n6[raise ValueError(f'Too many URLs (max...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;限制 URL 數量&#39;]
n4[max_urls = 500]
n5{if len(v) &gt; max_urls}
n6[raise ValueError(f&#39;Too many URLs (max...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
214. scan aiva scan schemas Function validate method
flowchart TB
n1([開始])
n2([結束])
n3['驗證 HTTP 方法']
n4[allowed = {'GET', &#...]
n5{if v.upper() not in allowed}
n6[raise ValueError(f'Invalid HTTP method: &...]
n7[]
n8[return v.upper()]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;驗證 HTTP 方法&#39;]
n4[allowed = {&#39;GET&#39;, &#...]
n5{if v.upper() not in allowed}
n6[raise ValueError(f&#39;Invalid HTTP method: &...]
n7[]
n8[return v.upper()]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
215. scan aiva scan schemas Function validate request type
flowchart TB
n1([開始])
n2([結束])
n3['驗證請求類型']
n4[allowed = {'xhr', &#...]
n5{if v.lower() not in allowed}
n6[raise ValueError(f'Invalid request_type: ...]
n7[]
n8[return v.lower()]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;驗證請求類型&#39;]
n4[allowed = {&#39;xhr&#39;, &#...]
n5{if v.lower() not in allowed}
n6[raise ValueError(f&#39;Invalid request_type: ...]
n7[]
n8[return v.lower()]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
216. scan aiva scan schemas Module
flowchart TB
n1([開始])
n2([結束])
n3['\nScan 模組專用數據合約\n定義掃描引擎相關的所有數據結構,基於 Pydantic...]
n4[from __future__ import annotations]
n5[from typing import Any]
n6[from pydantic import BaseModel, Field, field_valid...]
n7[from services.aiva_common.enums import Location, S...]
n8[class SensitiveMatch(...)]
n9[class JavaScriptAnalysisResult(...)]
n10[class NetworkRequest(...)]
n11[class InteractionResult(...)]
n12[class DynamicScanTask(...)]
n13[class DynamicScanResult(...)]
n14[__all__ = ['SensitiveInfoType'...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nScan 模組專用數據合約\n定義掃描引擎相關的所有數據結構,基於 Pydantic...]
n4[from __future__ import annotations]
n5[from typing import Any]
n6[from pydantic import BaseModel, Field, field_valid...]
n7[from services.aiva_common.enums import Location, S...]
n8[class SensitiveMatch(...)]
n9[class JavaScriptAnalysisResult(...)]
n10[class NetworkRequest(...)]
n11[class InteractionResult(...)]
n12[class DynamicScanTask(...)]
n13[class DynamicScanResult(...)]
n14[__all__ = [&#39;SensitiveInfoType&#39...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n2
217. scan aiva scan scope manager Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化範圍管理器\n\n Args:\n ...]
n4[self.scope = scope]
n5[self._allowed_hosts_set = set(scope.allowed_ho...]
n6[self._exclusion_patterns = self._compile_exclus...]
n7[self._stats = {'total_checked...]
n8[logger.info(f'ScopeManager initialized: &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化範圍管理器\n\n Args:\n ...]
n4[self.scope = scope]
n5[self._allowed_hosts_set = set(scope.allowed_ho...]
n6[self._exclusion_patterns = self._compile_exclus...]
n7[self._stats = {&#39;total_checked&#3...]
n8[logger.info(f&#39;ScopeManager initialized: &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
218. scan aiva scan scope manager Function compile exclusion patterns
flowchart TB
n1([開始])
n2([結束])
n3['\n 編譯排除模式為正則表達式\n\n Args:\n ...]
n4[patterns = []]
n5{for exclusion in exclusions}
n6[try]
n7[pattern = self._compile_patter...]
n8[patterns.append(pattern)]
n9[]
n10[except re.error]
n11[logger.warning(f"Invalid exclusion pattern &...]
n12[]
n13[return patterns]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 --> n7
n6 --> n10
n7 --> n8
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n9
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 編譯排除模式為正則表達式\n\n Args:\n ...]
n4[patterns = []]
n5{for exclusion in exclusions}
n6[try]
n7[pattern = self._compile_patter...]
n8[patterns.append(pattern)]
n9[]
n10[except re.error]
n11[logger.warning(f&quot;Invalid exclusion pattern &...]
n12[]
n13[return patterns]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n12
n6 --> n7
n6 --> n10
n7 --> n8
n8 --> n9
n9 --> n5
n10 --> n11
n11 --> n9
n12 --> n13
n13 --> n2
219. scan aiva scan scope manager Function compile pattern
flowchart TB
n1([開始])
n2([結束])
n3['\n 將通配符模式編譯為正則表達式\n\n 支持的模式:\n...]
n4[regex = re.escape(pattern)]
n5[regex = regex.replace('\\*\\...]
n6[regex = regex.replace('\\*',...]
n7[regex = regex.replace('DOUBL...]
n8[regex = regex.replace('\\?',...]
n9[regex = f'^{regex}$']
n10[return re.compile(regex, re.IGNORECAS...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 將通配符模式編譯為正則表達式\n\n 支持的模式:\n...]
n4[regex = re.escape(pattern)]
n5[regex = regex.replace(&#39;\\*\\...]
n6[regex = regex.replace(&#39;\\*&#39;,...]
n7[regex = regex.replace(&#39;DOUBL...]
n8[regex = regex.replace(&#39;\\?&#39;,...]
n9[regex = f&#39;^{regex}$&#39;]
n10[return re.compile(regex, re.IGNORECAS...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
220. scan aiva scan scope manager Function is host allowed
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查主機名是否被允許(內部方法)\n\n Args:\...]
n4{if not hostname}
n5[return False]
n6[]
n7{if not self._allowed_hosts_set}
n8[return True]
n9[]
n10{if hostname in self._allowed_h...}
n11[return True]
n12[]
n13{if self.scope.include_subdomains}
n14{for allowed_host in self._allowed_hos...}
n15{if hostname.endswith(f'.{allow...}
n16[return True]
n17[]
n18[]
n19[]
n20[return False]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n19
n14 -->|Yes| n15
n14 -->|No| n18
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n14
n18 --> n19
n19 --> n20
n20 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查主機名是否被允許(內部方法)\n\n Args:\...]
n4{if not hostname}
n5[return False]
n6[]
n7{if not self._allowed_hosts_set}
n8[return True]
n9[]
n10{if hostname in self._allowed_h...}
n11[return True]
n12[]
n13{if self.scope.include_subdomains}
n14{for allowed_host in self._allowed_hos...}
n15{if hostname.endswith(f&#39;.{allow...}
n16[return True]
n17[]
n18[]
n19[]
n20[return False]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 -->|Yes| n11
n10 -->|No| n12
n11 --> n12
n12 --> n13
n13 -->|Yes| n14
n13 -->|No| n19
n14 -->|Yes| n15
n14 -->|No| n18
n15 -->|Yes| n16
n15 -->|No| n17
n16 --> n17
n17 --> n14
n18 --> n19
n19 --> n20
n20 --> n2
221. scan aiva scan scope manager Function is valid hostname
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查主機名是否有效\n\n Args:\n ...]
n4{if not hostname}
n5[return False]
n6[]
n7[pattern = '^[a-zA-Z0-9]([a-zA...]
n8[return bool(re.match(pattern, hostnam...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查主機名是否有效\n\n Args:\n ...]
n4{if not hostname}
n5[return False]
n6[]
n7[pattern = &#39;^[a-zA-Z0-9]([a-zA...]
n8[return bool(re.match(pattern, hostnam...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
222. scan aiva scan scope manager Function matches exclusion
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查 URL 是否匹配任何排除模式\n\n Args:...]
n4[return any((pattern.search(url) for p...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查 URL 是否匹配任何排除模式\n\n Args:...]
n4[return any((pattern.search(url) for p...]
n1 --> n3
n3 --> n4
n4 --> n2
223. scan aiva scan scope manager Function add allowed host
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加允許的主機\n\n Args:\n ...]
n4{if hostname and hostname not i...}
n5[self._allowed_hosts_set.add(hostname)]
n6[self.scope.allowed_hosts.append(hostname)]
n7[logger.info(f'Added allowed host: {h...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加允許的主機\n\n Args:\n ...]
n4{if hostname and hostname not i...}
n5[self._allowed_hosts_set.add(hostname)]
n6[self.scope.allowed_hosts.append(hostname)]
n7[logger.info(f&#39;Added allowed host: {h...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
224. scan aiva scan scope manager Function add exclusion
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加排除模式\n\n Args:\n ...]
n4{if pattern and pattern not in ...}
n5[self.scope.exclusions.append(pattern)]
n6[self._exclusion_patterns.append(self._compile_patt...]
n7[logger.info(f'Added exclusion pattern: ...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加排除模式\n\n Args:\n ...]
n4{if pattern and pattern not in ...}
n5[self.scope.exclusions.append(pattern)]
n6[self._exclusion_patterns.append(self._compile_patt...]
n7[logger.info(f&#39;Added exclusion pattern: &#...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
225. scan aiva scan scope manager Function clone
flowchart TB
n1([開始])
n2([結束])
n3['\n 克隆當前範圍管理器\n\n Returns:\n ...]
n4[import copy]
n5[new_scope = copy.deepcopy(self.s...]
n6[return ScopeManager(new_scope)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 克隆當前範圍管理器\n\n Returns:\n ...]
n4[import copy]
n5[new_scope = copy.deepcopy(self.s...]
n6[return ScopeManager(new_scope)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
226. scan aiva scan scope manager Function filter urls
flowchart TB
n1([開始])
n2([結束])
n3['\n 過濾 URL 列表,只返回在範圍內的 URL\n\n ...]
n4[return [url for url in urls if self.i...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 過濾 URL 列表,只返回在範圍內的 URL\n\n ...]
n4[return [url for url in urls if self.i...]
n1 --> n3
n3 --> n4
n4 --> n2
227. scan aiva scan scope manager Function get allowed hosts
flowchart TB
n1([開始])
n2([結束])
n3['獲取允許的主機列表']
n4[return list(self._allowed_hosts_set)]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取允許的主機列表&#39;]
n4[return list(self._allowed_hosts_set)]
n1 --> n3
n3 --> n4
n4 --> n2
228. scan aiva scan scope manager Function get exclusions
flowchart TB
n1([開始])
n2([結束])
n3['獲取排除模式列表']
n4[return self.scope.exclusions.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取排除模式列表&#39;]
n4[return self.scope.exclusions.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
229. scan aiva scan scope manager Function get scope summary
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取範圍配置摘要\n\n Returns:\n ...]
n4[allowed_hosts_display = ', '.join...]
n5[lines = ['Scope Configuratio...]
n6{if self.scope.exclusions}
n7[lines.append(' Exclusions:'&...]
n8{for exclusion in self.scope.exclus...}
n9[lines.append(f' - {exclusion}...]
n10[]
n11{if len(self.scope.exclusions) > 5}
n12[lines.append(f' ... and {len(...]
n13[]
n14[]
n15[stats = self.get_stats()]
n16{if stats['total_checked']...}
n17[lines.append('\n Statistics:'...]
n18[lines.append(f" Total Checked: {stat...]
n19[lines.append(f" In Scope: {stats[...]
n20[lines.append(f" Out of Scope: {stats...]
n21{if stats['total_checked']...}
n22[in_scope_percent = stats['in_scope&...]
n23[lines.append(f' In Scope %: {in_s...]
n24[]
n25[]
n26[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n14
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 -->|Yes| n17
n16 -->|No| n25
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n24
n22 --> n23
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取範圍配置摘要\n\n Returns:\n ...]
n4[allowed_hosts_display = &#39;, &#39;.join...]
n5[lines = [&#39;Scope Configuratio...]
n6{if self.scope.exclusions}
n7[lines.append(&#39; Exclusions:&#39;&...]
n8{for exclusion in self.scope.exclus...}
n9[lines.append(f&#39; - {exclusion}...]
n10[]
n11{if len(self.scope.exclusions) &gt; 5}
n12[lines.append(f&#39; ... and {len(...]
n13[]
n14[]
n15[stats = self.get_stats()]
n16{if stats[&#39;total_checked&#39;]...}
n17[lines.append(&#39;\n Statistics:&#39...]
n18[lines.append(f&quot; Total Checked: {stat...]
n19[lines.append(f&quot; In Scope: {stats[...]
n20[lines.append(f&quot; Out of Scope: {stats...]
n21{if stats[&#39;total_checked&#39;]...}
n22[in_scope_percent = stats[&#39;in_scope&&#...]
n23[lines.append(f&#39; In Scope %: {in_s...]
n24[]
n25[]
n26[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n14
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 -->|Yes| n17
n16 -->|No| n25
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 -->|Yes| n22
n21 -->|No| n24
n22 --> n23
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n2
230. scan aiva scan scope manager Function get stats
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取統計信息\n\n Returns:\n ...]
n4[return self._stats.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取統計信息\n\n Returns:\n ...]
n4[return self._stats.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
231. scan aiva scan scope manager Function is host allowed
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查主機名是否被允許\n\n Args:\n ...]
n4[return self._is_host_allowed(hostname...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查主機名是否被允許\n\n Args:\n ...]
n4[return self._is_host_allowed(hostname...]
n1 --> n3
n3 --> n4
n4 --> n2
232. scan aiva scan scope manager Function is in scope
flowchart TB
n1([開始])
n2([結束])
n3['\n 檢查 URL 是否在掃描範圍內\n\n Args:\n...]
n4[self._stats['total_checked'...]
n5[try]
n6[parsed = urlparse(url)]
n7{if not self._is_host_allowed(p...}
n8[logger.debug(f'Host not allowed: {pa...]
n9[self._stats['out_of_scope' ...]
n10[return False]
n11[]
n12{if self._matches_exclusion(url)}
n13[logger.debug(f'Matches exclusion pattern:...]
n14[self._stats['out_of_scope' ...]
n15[return False]
n16[]
n17[self._stats['in_scope'] += 1]
n18[return True]
n19[]
n20[except Exception]
n21[logger.warning(f'Failed to parse URL ...]
n22[self._stats['out_of_scope' ...]
n23[return False]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n5 --> n20
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n11
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n19
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 檢查 URL 是否在掃描範圍內\n\n Args:\n...]
n4[self._stats[&#39;total_checked&#39;&#...]
n5[try]
n6[parsed = urlparse(url)]
n7{if not self._is_host_allowed(p...}
n8[logger.debug(f&#39;Host not allowed: {pa...]
n9[self._stats[&#39;out_of_scope&#39;	...]
n10[return False]
n11[]
n12{if self._matches_exclusion(url)}
n13[logger.debug(f&#39;Matches exclusion pattern:...]
n14[self._stats[&#39;out_of_scope&#39;	...]
n15[return False]
n16[]
n17[self._stats[&#39;in_scope&#39;] += 1]
n18[return True]
n19[]
n20[except Exception]
n21[logger.warning(f&#39;Failed to parse URL ...]
n22[self._stats[&#39;out_of_scope&#39;	...]
n23[return False]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n5 --> n20
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n11
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n2
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n19
233. scan aiva scan scope manager Function is subdomain included
flowchart TB
n1([開始])
n2([結束])
n3['是否包含子域名']
n4[return self.scope.include_subdomains]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;是否包含子域名&#39;]
n4[return self.scope.include_subdomains]
n1 --> n3
n3 --> n4
n4 --> n2
234. scan aiva scan scope manager Function merge with
flowchart TB
n1([開始])
n2([結束])
n3['\n 合併另一個範圍管理器的配置\n\n Args:\n ...]
n4{for host in other.get_allowed...}
n5[self.add_allowed_host(host)]
n6[]
n7{for exclusion in other.get_exclusi...}
n8{if exclusion not in self.scope...}
n9[self.add_exclusion(exclusion)]
n10[]
n11[]
n12{if other.is_subdomain_included...}
n13[self.set_include_subdomains(True)]
n14[]
n15[logger.info('Merged scope configurations&...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n4
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n11
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n7
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 合併另一個範圍管理器的配置\n\n Args:\n ...]
n4{for host in other.get_allowed...}
n5[self.add_allowed_host(host)]
n6[]
n7{for exclusion in other.get_exclusi...}
n8{if exclusion not in self.scope...}
n9[self.add_exclusion(exclusion)]
n10[]
n11[]
n12{if other.is_subdomain_included...}
n13[self.set_include_subdomains(True)]
n14[]
n15[logger.info(&#39;Merged scope configurations&...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n4
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n11
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n10
n10 --> n7
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n14
n13 --> n14
n14 --> n15
n15 --> n2
235. scan aiva scan scope manager Function remove allowed host
flowchart TB
n1([開始])
n2([結束])
n3['\n 移除允許的主機\n\n Args:\n ...]
n4{if hostname in self._allowed_h...}
n5[self._allowed_hosts_set.remove(hostname)]
n6{if hostname in self.scope.allo...}
n7[self.scope.allowed_hosts.remove(hostname)]
n8[]
n9[logger.info(f'Removed allowed host: {...]
n10[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n10
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 移除允許的主機\n\n Args:\n ...]
n4{if hostname in self._allowed_h...}
n5[self._allowed_hosts_set.remove(hostname)]
n6{if hostname in self.scope.allo...}
n7[self.scope.allowed_hosts.remove(hostname)]
n8[]
n9[logger.info(f&#39;Removed allowed host: {...]
n10[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n10
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n8
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
236. scan aiva scan scope manager Function remove exclusion
flowchart TB
n1([開始])
n2([結束])
n3['\n 移除排除模式\n\n Args:\n ...]
n4{if pattern in self.scope.exclu...}
n5[self.scope.exclusions.remove(pattern)]
n6[self._exclusion_patterns = self._compile_exclus...]
n7[logger.info(f'Removed exclusion pattern: ...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 移除排除模式\n\n Args:\n ...]
n4{if pattern in self.scope.exclu...}
n5[self.scope.exclusions.remove(pattern)]
n6[self._exclusion_patterns = self._compile_exclus...]
n7[logger.info(f&#39;Removed exclusion pattern: ...]
n8[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n8
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
237. scan aiva scan scope manager Function reset stats
flowchart TB
n1([開始])
n2([結束])
n3['重置統計信息']
n4[self._stats = {'total_checked...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置統計信息&#39;]
n4[self._stats = {&#39;total_checked&#3...]
n1 --> n3
n3 --> n4
n4 --> n2
238. scan aiva scan scope manager Function set include subdomains
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置是否包含子域名\n\n Args:\n ...]
n4[self.scope.include_subdomains = include]
n5[logger.info(f'Set include_subdomains to: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置是否包含子域名\n\n Args:\n ...]
n4[self.scope.include_subdomains = include]
n5[logger.info(f&#39;Set include_subdomains to: ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
239. scan aiva scan scope manager Function validate scope
flowchart TB
n1([開始])
n2([結束])
n3['\n 驗證範圍配置的有效性\n\n Returns:\n ...]
n4[errors = []]
n5{for pattern in self.scope.exclus...}
n6[try]
n7[self._compile_pattern(pattern)]
n8[]
n9[except re.error]
n10[errors.append(f"Invalid exclusion pattern &a...]
n11[]
n12{for host in self._allowed_hos...}
n13{if not self._is_valid_hostname...}
n14[errors.append(f"Invalid hostname: &#...]
n15[]
n16[]
n17[is_valid = len(errors) == 0]
n18[return (is_valid, errors)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 --> n7
n6 --> n9
n7 --> n8
n8 --> n5
n9 --> n10
n10 --> n8
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n15
n15 --> n12
n16 --> n17
n17 --> n18
n18 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 驗證範圍配置的有效性\n\n Returns:\n ...]
n4[errors = []]
n5{for pattern in self.scope.exclus...}
n6[try]
n7[self._compile_pattern(pattern)]
n8[]
n9[except re.error]
n10[errors.append(f&quot;Invalid exclusion pattern &a...]
n11[]
n12{for host in self._allowed_hos...}
n13{if not self._is_valid_hostname...}
n14[errors.append(f&quot;Invalid hostname: &#...]
n15[]
n16[]
n17[is_valid = len(errors) == 0]
n18[return (is_valid, errors)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n11
n6 --> n7
n6 --> n9
n7 --> n8
n8 --> n5
n9 --> n10
n10 --> n8
n11 --> n12
n12 -->|Yes| n13
n12 -->|No| n16
n13 -->|Yes| n14
n13 -->|No| n15
n14 --> n15
n15 --> n12
n16 --> n17
n17 --> n18
n18 --> n2
240. scan aiva scan scope manager Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import re]
n5[from urllib.parse import urlparse]
n6[from services.aiva_common.schemas import ScanScope]
n7[from services.aiva_common.utils import get_logger]
n8[logger = get_logger(__name__)]
n9[class ScopeManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import re]
n5[from urllib.parse import urlparse]
n6[from services.aiva_common.schemas import ScanScope]
n7[from services.aiva_common.utils import get_logger]
n8[logger = get_logger(__name__)]
n9[class ScopeManager(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
241. scan aiva scan sensitive data scanner Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化敏感資料掃描器']
n4[self.compiled_patterns = {name: re.compile(pa...]
n5[self.matches: list[SensitiveMatch] = []]
n6[logger.debug('SensitiveDataScanner initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化敏感資料掃描器&#39;]
n4[self.compiled_patterns = {name: re.compile(pa...]
n5[self.matches: list[SensitiveMatch] = []]
n6[logger.debug(&#39;SensitiveDataScanner initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
242. scan aiva scan sensitive data scanner Function determine severity
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = ['aws_secret_key&...]
n5[high_patterns = ['aws_access_key&#...]
n6[medium_patterns = ['api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return Severity.CRITICAL]
n9{if pattern_type in high_patterns}
n10[return Severity.HIGH]
n11{if pattern_type in medium_patt...}
n12[return Severity.MEDIUM]
n13[return Severity.LOW]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = [&#39;aws_secret_key&...]
n5[high_patterns = [&#39;aws_access_key&#...]
n6[medium_patterns = [&#39;api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return Severity.CRITICAL]
n9{if pattern_type in high_patterns}
n10[return Severity.HIGH]
n11{if pattern_type in medium_patt...}
n12[return Severity.MEDIUM]
n13[return Severity.LOW]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
243. scan aiva scan sensitive data scanner Function get context
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取匹配的上下文\n\n Args:\n ...]
n4[context_start = max(0, start - conte...]
n5[context_end = min(len(content), en...]
n6[context = content[context_star...]
n7[match_length = end - start]
n8[match_in_context_start = start - context_star...]
n9[match_in_context_end = match_in_context_sta...]
n10[masked_context = context[:match_in_co...]
n11[return masked_context.replace('\n&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取匹配的上下文\n\n Args:\n ...]
n4[context_start = max(0, start - conte...]
n5[context_end = min(len(content), en...]
n6[context = content[context_star...]
n7[match_length = end - start]
n8[match_in_context_start = start - context_star...]
n9[match_in_context_end = match_in_context_sta...]
n10[masked_context = context[:match_in_co...]
n11[return masked_context.replace(&#39;\n&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
244. scan aiva scan sensitive data scanner Function get severity
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = ['aws_secret_key&...]
n5[high_patterns = ['aws_access_key&#...]
n6[medium_patterns = ['api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return 'critical']
n9{if pattern_type in high_patterns}
n10[return 'high']
n11{if pattern_type in medium_patt...}
n12[return 'medium']
n13[return 'low']
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = [&#39;aws_secret_key&...]
n5[high_patterns = [&#39;aws_access_key&#...]
n6[medium_patterns = [&#39;api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return &#39;critical&#39;]
n9{if pattern_type in high_patterns}
n10[return &#39;high&#39;]
n11{if pattern_type in medium_patt...}
n12[return &#39;medium&#39;]
n13[return &#39;low&#39;]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
245. scan aiva scan sensitive data scanner Function mask sensitive value
flowchart TB
n1([開始])
n2([結束])
n3['\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...]
n4{if len(value) <= 8}
n5[return '***']
n6[]
n7[return f'{value[:4]}......]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...]
n4{if len(value) &lt;= 8}
n5[return &#39;***&#39;]
n6[]
n7[return f&#39;{value[:4]}......]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
246. scan aiva scan sensitive data scanner Function clear matches
flowchart TB
n1([開始])
n2([結束])
n3['清空所有匹配記錄']
n4[self.matches.clear()]
n5[logger.debug('Cleared all sensitive data ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空所有匹配記錄&#39;]
n4[self.matches.clear()]
n5[logger.debug(&#39;Cleared all sensitive data ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
247. scan aiva scan sensitive data scanner Function get all matches
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取所有發現的敏感資料匹配\n\n Returns:\...]
n4[return self.matches.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取所有發現的敏感資料匹配\n\n Returns:\...]
n4[return self.matches.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
248. scan aiva scan sensitive data scanner Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取統計信息\n\n Returns:\n ...]
n4[stats: dict[str, Any] = {'total_...]
n5{for match in self.matches}
n6[stats['by_type'][matc...]
n7[stats['by_severity'][...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取統計信息\n\n Returns:\n ...]
n4[stats: dict[str, Any] = {&#39;total_...]
n5{for match in self.matches}
n6[stats[&#39;by_type&#39;][matc...]
n7[stats[&#39;by_severity&#39;][...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
249. scan aiva scan sensitive data scanner Function scan content
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描內容中的敏感資料\n\n Args:\n ...]
n4[matches: list[SensitiveMatch] = []]
n5{for (pattern_name, pattern_regex) in self.compile...}
n6[found_matches = pattern_regex.findit...]
n7{for match in found_matches}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f'Sensitive data found: ...]
n12[]
n13[]
n14{if matches}
n15[logger.info(f'Found {len(matches...]
n16[]
n17[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n7
n12 --> n5
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 掃描內容中的敏感資料\n\n Args:\n ...]
n4[matches: list[SensitiveMatch] = []]
n5{for (pattern_name, pattern_regex) in self.compile...}
n6[found_matches = pattern_regex.findit...]
n7{for match in found_matches}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f&#39;Sensitive data found: &#...]
n12[]
n13[]
n14{if matches}
n15[logger.info(f&#39;Found {len(matches...]
n16[]
n17[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n7
n12 --> n5
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n17
n17 --> n2
250. scan aiva scan sensitive data scanner Function scan headers
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...]
n4[matches: list[SensitiveMatch] = []]
n5[sensitive_headers = ['authorization&&...]
n6{for (header_name, header_value) in headers.items&...}
n7{if header_name.lower() in sens...}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f'Sensitive header found: ...]
n12[]
n13[]
n14[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n13
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n6
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...]
n4[matches: list[SensitiveMatch] = []]
n5[sensitive_headers = [&#39;authorization&&...]
n6{for (header_name, header_value) in headers.items&...}
n7{if header_name.lower() in sens...}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f&#39;Sensitive header found: ...]
n12[]
n13[]
n14[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n13
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n6
n13 --> n14
n14 --> n2
251. scan aiva scan sensitive data scanner Module
flowchart TB
n1([開始])
n2([結束])
n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Severity]
n8[from services.aiva_common.schemas import Sensitive...]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class SensitiveDataScanner(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Severity]
n8[from services.aiva_common.schemas import Sensitive...]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class SensitiveDataScanner(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
252. scan aiva scan strategy controller Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化策略控制器\n\n Args:\n ...]
n4[self.strategy = strategy.lower()]
n5[self._parameters = self._load_strategy_...]
n6[self._customizations: dict[str, Any] = {}]
n7[logger.info(f'StrategyController initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化策略控制器\n\n Args:\n ...]
n4[self.strategy = strategy.lower()]
n5[self._parameters = self._load_strategy_...]
n6[self._customizations: dict[str, Any] = {}]
n7[logger.info(f&#39;StrategyController initiali...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
253. scan aiva scan strategy controller Function load strategy parameters
flowchart TB
n1([開始])
n2([結束])
n3['\n 加載策略參數\n\n Returns:\n ...]
n4{if self.strategy in self._STRA...}
n5[return self._STRATEGY_PRESETS[self.st...]
n6[]
n7[logger.warning(f"Unknown strategy &#...]
n8[return self._STRATEGY_PRESETS[ScanStr...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 加載策略參數\n\n Returns:\n ...]
n4{if self.strategy in self._STRA...}
n5[return self._STRATEGY_PRESETS[self.st...]
n6[]
n7[logger.warning(f&quot;Unknown strategy &#...]
n8[return self._STRATEGY_PRESETS[ScanStr...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
254. scan aiva scan strategy controller Function apply to config
flowchart TB
n1([開始])
n2([結束])
n3['\n 將策略應用到配置控制中心\n\n Args:\n ...]
n4[params = self._parameters]
n5[config_center.update_crawling_config(max_depth=par...]
n6[config_center.update_dynamic_config(enabled=params...]
n7[config_center.update_performance_config(max_concur...]
n8[logger.info(f"Applied strategy '...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 將策略應用到配置控制中心\n\n Args:\n ...]
n4[params = self._parameters]
n5[config_center.update_crawling_config(max_depth=par...]
n6[config_center.update_dynamic_config(enabled=params...]
n7[config_center.update_performance_config(max_concur...]
n8[logger.info(f&quot;Applied strategy &#39;...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
255. scan aiva scan strategy controller Function clone
flowchart TB
n1([開始])
n2([結束])
n3['\n 克隆當前策略控制器\n\n Returns:\n ...]
n4[new_controller = StrategyController(s...]
n5[new_controller._parameters = StrategyParameters(*...]
n6[new_controller._customizations = self._customizations...]
n7[return new_controller]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 克隆當前策略控制器\n\n Returns:\n ...]
n4[new_controller = StrategyController(s...]
n5[new_controller._parameters = StrategyParameters(*...]
n6[new_controller._customizations = self._customizations...]
n7[return new_controller]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n2
256. scan aiva scan strategy controller Function compare with
flowchart TB
n1([開始])
n2([結束])
n3['\n 比較與另一個策略的差異\n\n Args:\n ...]
n4{if other_strategy not in self....}
n5[logger.warning(f'Unknown strategy for com...]
n6[return {}]
n7[]
n8[other_params = self._STRATEGY_PRESE...]
n9[current_params = self._parameters]
n10[differences = {}]
n11{for field in current_params.__...}
n12[current_value = getattr(current_para...]
n13[other_value = getattr(other_params...]
n14{if current_value != other_value}
n15[differences[field] = (current_value, othe...]
n16[]
n17[]
n18[return differences]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n17
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n11
n17 --> n18
n18 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 比較與另一個策略的差異\n\n Args:\n ...]
n4{if other_strategy not in self....}
n5[logger.warning(f&#39;Unknown strategy for com...]
n6[return {}]
n7[]
n8[other_params = self._STRATEGY_PRESE...]
n9[current_params = self._parameters]
n10[differences = {}]
n11{for field in current_params.__...}
n12[current_value = getattr(current_para...]
n13[other_value = getattr(other_params...]
n14{if current_value != other_value}
n15[differences[field] = (current_value, othe...]
n16[]
n17[]
n18[return differences]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n7
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 -->|Yes| n12
n11 -->|No| n17
n12 --> n13
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n11
n17 --> n18
n18 --> n2
257. scan aiva scan strategy controller Function customize
flowchart TB
n1([開始])
n2([結束])
n3['\n 自定義策略參數\n\n Args:\n ...]
n4{for (key, value) in kwargs.items()}
n5{if hasattr(self._parameters, key)}
n6[setattr(self._parameters, key, value)]
n7[self._customizations[key] = value]
n8[logger.debug(f'Customized parameter: ...]
n9[logger.warning(f'Unknown parameter: {...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n11
n5 -->|Yes| n6
n5 -->|No| n9
n6 --> n7
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n4
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 自定義策略參數\n\n Args:\n ...]
n4{for (key, value) in kwargs.items()}
n5{if hasattr(self._parameters, key)}
n6[setattr(self._parameters, key, value)]
n7[self._customizations[key] = value]
n8[logger.debug(f&#39;Customized parameter: ...]
n9[logger.warning(f&#39;Unknown parameter: {...]
n10[]
n11[]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n11
n5 -->|Yes| n6
n5 -->|No| n9
n6 --> n7
n7 --> n8
n8 --> n10
n9 --> n10
n10 --> n4
n11 --> n2
258. scan aiva scan strategy controller Function estimate scan time
flowchart TB
n1([開始])
n2([結束])
n3['\n 估算掃描時間(秒)\n\n Args:\n ...]
n4[params = self._parameters]
n5[pages = min(estimated_pages,...]
n6[time_by_rate = pages / params.reque...]
n7[time_by_timeout = pages * params.reque...]
n8[estimated_time = max(time_by_rate, ti...]
n9{if params.enable_dynamic_scan}
n10[estimated_time *= 1.5]
n11[]
n12[return estimated_time]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 估算掃描時間(秒)\n\n Args:\n ...]
n4[params = self._parameters]
n5[pages = min(estimated_pages,...]
n6[time_by_rate = pages / params.reque...]
n7[time_by_timeout = pages * params.reque...]
n8[estimated_time = max(time_by_rate, ti...]
n9{if params.enable_dynamic_scan}
n10[estimated_time *= 1.5]
n11[]
n12[return estimated_time]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n2
259. scan aiva scan strategy controller Function get available strategies
flowchart TB
n1([開始])
n2([結束])
n3['獲取所有可用的策略名稱']
n4[return list(cls._STRATEGY_PRESETS.key...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取所有可用的策略名稱&#39;]
n4[return list(cls._STRATEGY_PRESETS.key...]
n1 --> n3
n3 --> n4
n4 --> n2
260. scan aiva scan strategy controller Function get concurrent requests
flowchart TB
n1([開始])
n2([結束])
n3['獲取並發請求數']
n4[return self._parameters.concurrent_re...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取並發請求數&#39;]
n4[return self._parameters.concurrent_re...]
n1 --> n3
n3 --> n4
n4 --> n2
261. scan aiva scan strategy controller Function get max depth
flowchart TB
n1([開始])
n2([結束])
n3['獲取最大爬蟲深度']
n4[return self._parameters.max_depth]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取最大爬蟲深度&#39;]
n4[return self._parameters.max_depth]
n1 --> n3
n3 --> n4
n4 --> n2
262. scan aiva scan strategy controller Function get max pages
flowchart TB
n1([開始])
n2([結束])
n3['獲取最大頁面數']
n4[return self._parameters.max_pages]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取最大頁面數&#39;]
n4[return self._parameters.max_pages]
n1 --> n3
n3 --> n4
n4 --> n2
263. scan aiva scan strategy controller Function get parameters
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取當前策略參數\n\n Returns:\n ...]
n4[return self._parameters]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取當前策略參數\n\n Returns:\n ...]
n4[return self._parameters]
n1 --> n3
n3 --> n4
n4 --> n2
264. scan aiva scan strategy controller Function get recommended strategy for target
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據目標特徵推薦策略\n\n Args:\n ...]
n4[recommendations = {('small&#...]
n5[key = (target_size.lower()...]
n6[recommended = recommendations.get(...]
n7[logger.info(f'Recommended strategy for ...]
n8[return recommended]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 根據目標特徵推薦策略\n\n Args:\n ...]
n4[recommendations = {(&#39;small&#...]
n5[key = (target_size.lower()...]
n6[recommended = recommendations.get(...]
n7[logger.info(f&#39;Recommended strategy for &#...]
n8[return recommended]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
265. scan aiva scan strategy controller Function get requests per second
flowchart TB
n1([開始])
n2([結束])
n3['獲取每秒請求數']
n4[return self._parameters.requests_per_...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取每秒請求數&#39;]
n4[return self._parameters.requests_per_...]
n1 --> n3
n3 --> n4
n4 --> n2
266. scan aiva scan strategy controller Function get strategy description
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取策略描述\n\n Args:\n ...]
n4[descriptions = {ScanStrategy.CONSER...]
n5[return descriptions.get(strategy, '未知...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取策略描述\n\n Args:\n ...]
n4[descriptions = {ScanStrategy.CONSER...]
n5[return descriptions.get(strategy, &#39;未知...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
267. scan aiva scan strategy controller Function get strategy name
flowchart TB
n1([開始])
n2([結束])
n3['獲取策略名稱']
n4[return self.strategy]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;獲取策略名稱&#39;]
n4[return self.strategy]
n1 --> n3
n3 --> n4
n4 --> n2
268. scan aiva scan strategy controller Function get strategy summary
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取策略摘要\n\n Returns:\n ...]
n4[params = self._parameters]
n5[lines = [f'Strategy: {self.s...]
n6{if self._customizations}
n7[lines.append('\n Customizations:&...]
n8{for (key, value) in self._customizati...}
n9[lines.append(f' {key}: {...]
n10[]
n11[]
n12[return '\n'.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n11
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取策略摘要\n\n Returns:\n ...]
n4[params = self._parameters]
n5[lines = [f&#39;Strategy: {self.s...]
n6{if self._customizations}
n7[lines.append(&#39;\n Customizations:&...]
n8{for (key, value) in self._customizati...}
n9[lines.append(f&#39; {key}: {...]
n10[]
n11[]
n12[return &#39;\n&#39;.join(lines)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n11
n7 --> n8
n8 -->|Yes| n9
n8 -->|No| n10
n9 --> n8
n10 --> n11
n11 --> n12
n12 --> n2
269. scan aiva scan strategy controller Function is aggressive
flowchart TB
n1([開始])
n2([結束])
n3['是否為激進策略']
n4[return self.strategy in [ScanStrategy...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;是否為激進策略&#39;]
n4[return self.strategy in [ScanStrategy...]
n1 --> n3
n3 --> n4
n4 --> n2
270. scan aiva scan strategy controller Function is dynamic scan enabled
flowchart TB
n1([開始])
n2([結束])
n3['是否啟用動態掃描']
n4[return self._parameters.enable_dynami...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;是否啟用動態掃描&#39;]
n4[return self._parameters.enable_dynami...]
n1 --> n3
n3 --> n4
n4 --> n2
271. scan aiva scan strategy controller Function is stealth
flowchart TB
n1([開始])
n2([結束])
n3['是否為隱秘策略']
n4[return self.strategy == ScanStrategy....]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;是否為隱秘策略&#39;]
n4[return self.strategy == ScanStrategy....]
n1 --> n3
n3 --> n4
n4 --> n2
272. scan aiva scan strategy controller Function reset customizations
flowchart TB
n1([開始])
n2([結束])
n3['重置所有自定義參數']
n4[self._parameters = self._load_strategy_...]
n5[self._customizations.clear()]
n6[logger.info(f"Reset customizations for strat...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置所有自定義參數&#39;]
n4[self._parameters = self._load_strategy_...]
n5[self._customizations.clear()]
n6[logger.info(f&quot;Reset customizations for strat...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
273. scan aiva scan strategy controller Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass]
n5[from enum import Enum]
n6[from typing import Any]
n7[from services.aiva_common.utils import get_logger]
n8[logger = get_logger(__name__)]
n9[class ScanStrategy(...)]
n10[class StrategyParameters(...)]
n11[class StrategyController(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[from dataclasses import dataclass]
n5[from enum import Enum]
n6[from typing import Any]
n7[from services.aiva_common.utils import get_logger]
n8[logger = get_logger(__name__)]
n9[class ScanStrategy(...)]
n10[class StrategyParameters(...)]
n11[class StrategyController(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
274. scan aiva scan worker Module
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import json]
n5[import time]
n6[from services.aiva_common.enums import ModuleName,...]
n7[from services.aiva_common.mq import get_broker]
n8[from services.aiva_common.schemas import AivaMessa...]
n9[from services.aiva_common.utils import get_logger,...]
n10[from .authentication_manager import Authentication...]
n11[from .core_crawling_engine.http_client_hi import H...]
n12[from .core_crawling_engine.static_content_parser i...]
n13[from .core_crawling_engine.url_queue_manager impor...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[logger = get_logger(__name__)]
n17[def run(...)]
n18[def _perform_scan(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[from __future__ import annotations]
n4[import json]
n5[import time]
n6[from services.aiva_common.enums import ModuleName,...]
n7[from services.aiva_common.mq import get_broker]
n8[from services.aiva_common.schemas import AivaMessa...]
n9[from services.aiva_common.utils import get_logger,...]
n10[from .authentication_manager import Authentication...]
n11[from .core_crawling_engine.http_client_hi import H...]
n12[from .core_crawling_engine.static_content_parser i...]
n13[from .core_crawling_engine.url_queue_manager impor...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[logger = get_logger(__name__)]
n17[def run(...)]
n18[def _perform_scan(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n2
275. scan aiva scan worker refactored Module
flowchart TB
n1([開始])
n2([結束])
n3['\n重構的 Scan Worker\n使用 ScanOrchestrator 進行統一的...]
n4[from __future__ import annotations]
n5[import json]
n6[from services.aiva_common.enums import ModuleName,...]
n7[from services.aiva_common.mq import get_broker]
n8[from services.aiva_common.schemas import AivaMessa...]
n9[from services.aiva_common.utils import get_logger,...]
n10[from .scan_orchestrator import ScanOrchestrator]
n11[logger = get_logger(__name__)]
n12[def run(...)]
n13[def _perform_scan_with_orchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n重構的 Scan Worker\n使用 ScanOrchestrator 進行統一的...]
n4[from __future__ import annotations]
n5[import json]
n6[from services.aiva_common.enums import ModuleName,...]
n7[from services.aiva_common.mq import get_broker]
n8[from services.aiva_common.schemas import AivaMessa...]
n9[from services.aiva_common.utils import get_logger,...]
n10[from .scan_orchestrator import ScanOrchestrator]
n11[logger = get_logger(__name__)]
n12[def run(...)]
n13[def _perform_scan_with_orchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
276. scan discovery schemas Function validate finding id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('finding_'...}
n4[raise ValueError("finding_id must start with...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith(&#39;finding_&#39...}
n4[raise ValueError(&quot;finding_id must start with...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
277. scan discovery schemas Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith(&#39;scan_&#39;)}
n4[raise ValueError(&quot;scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
278. scan discovery schemas Function validate strategy
flowchart TB
n1([開始])
n2([結束])
n3[allowed_strategies = ['passive...]
n4{if v not in allowed_strategies}
n5[raise ValueError(f'Strategy must be one o...]
n6[]
n7[return v]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[allowed_strategies = [&#39;passive&#3...]
n4{if v not in allowed_strategies}
n5[raise ValueError(f&#39;Strategy must be one o...]
n6[]
n7[return v]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
279. scan discovery schemas Function validate targets
flowchart TB
n1([開始])
n2([結束])
n3{if len(v) > 100}
n4[raise ValueError('Cannot scan more than 1...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if len(v) &gt; 100}
n4[raise ValueError(&#39;Cannot scan more than 1...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
280. scan discovery schemas Module
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA 掃描發現模式定義\n\n包含掃描、發現、資產清點、技術指紋等相關的數據模式...]
n4[from __future__ import annotations]
n5[from datetime import UTC, datetime]
n6[from typing import Any]
n7[from services.aiva_common.enums import AssetType, ...]
n8[from services.aiva_common.standards import CVERefe...]
n9[from pydantic import BaseModel, Field, HttpUrl, fi...]
n10[class ScanScope(...)]
n11[class ScanRequest(...)]
n12[class Asset(...)]
n13[class TechStackInfo(...)]
n14[class ServiceInfo(...)]
n15[class Fingerprints(...)]
n16[class AssetInventory(...)]
n17[class ScanResult(...)]
n18[class TargetInfo(...)]
n19[class FindingEvidence(...)]
n20[class FindingImpact(...)]
n21[class FindingRecommendation(...)]
n22[class VulnerabilityFinding(...)]
n23[class ScopeDefinition(...)]
n24[__all__ = ['ScanScope', &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nAIVA 掃描發現模式定義\n\n包含掃描、發現、資產清點、技術指紋等相關的數據模式...]
n4[from __future__ import annotations]
n5[from datetime import UTC, datetime]
n6[from typing import Any]
n7[from services.aiva_common.enums import AssetType, ...]
n8[from services.aiva_common.standards import CVERefe...]
n9[from pydantic import BaseModel, Field, HttpUrl, fi...]
n10[class ScanScope(...)]
n11[class ScanRequest(...)]
n12[class Asset(...)]
n13[class TechStackInfo(...)]
n14[class ServiceInfo(...)]
n15[class Fingerprints(...)]
n16[class AssetInventory(...)]
n17[class ScanResult(...)]
n18[class TargetInfo(...)]
n19[class FindingEvidence(...)]
n20[class FindingImpact(...)]
n21[class FindingRecommendation(...)]
n22[class VulnerabilityFinding(...)]
n23[class ScopeDefinition(...)]
n24[__all__ = [&#39;ScanScope&#39;, &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
281. scan models Function validate scan id
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith('scan_')}
n4[raise ValueError("scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3{if not v.startswith(&#39;scan_&#39;)}
n4[raise ValueError(&quot;scan_id must start with &a...]
n5[]
n6[return v]
n1 --> n3
n3 -->|Yes| n4
n3 -->|No| n5
n4 --> n5
n5 --> n6
n6 --> n2
282. scan models Function validate strategy
flowchart TB
n1([開始])
n2([結束])
n3['驗證掃描策略']
n4[allowed = {'quick', &...]
n5{if v not in allowed}
n6[raise ValueError(f'strategy must be one o...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;驗證掃描策略&#39;]
n4[allowed = {&#39;quick&#39;, &...]
n5{if v not in allowed}
n6[raise ValueError(f&#39;strategy must be one o...]
n7[]
n8[return v]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n2
283. scan models Function validate targets
flowchart TB
n1([開始])
n2([結束])
n3['驗證目標列表']
n4{if not v}
n5[raise ValueError('At least one target req...]
n6[]
n7{if len(v) > 100}
n8[raise ValueError('Too many targets (m...]
n9[]
n10[return v]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;驗證目標列表&#39;]
n4{if not v}
n5[raise ValueError(&#39;At least one target req...]
n6[]
n7{if len(v) &gt; 100}
n8[raise ValueError(&#39;Too many targets (m...]
n9[]
n10[return v]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n9
n9 --> n10
n10 --> n2
284. scan models Module
flowchart TB
n1([開始])
n2([結束])
n3['\nAIVA Scan Models - 掃描發現模組\n\n此文件包含與掃描、資產發現...]
n4[from __future__ import annotations]
n5[from datetime import UTC, datetime]
n6[from typing import Any]
n7[from pydantic import BaseModel, Field, HttpUrl, fi...]
n8[from ..aiva_common.enums import AssetType, Confide...]
n9[from ..aiva_common.schemas import Authentication, ...]
n10[class ScanScope(...)]
n11[class ScanStartPayload(...)]
n12[class EnhancedScanScope(...)]
n13[class EnhancedScanRequest(...)]
n14[class Asset(...)]
n15[class TechnicalFingerprint(...)]
n16[class Fingerprints(...)]
n17[class AssetInventoryItem(...)]
n18[class Summary(...)]
n19[class ScanCompletedPayload(...)]
n20[class Vulnerability(...)]
n21[class VulnerabilityDiscovery(...)]
n22[class VulnerabilityLifecyclePayload(...)]
n23[class VulnerabilityUpdatePayload(...)]
n24[class DiscoveredAsset(...)]
n25[class EASMDiscoveryPayload(...)]
n26[class EASMDiscoveryResult(...)]
n27[class EASMAsset(...)]
n28[class AssetLifecyclePayload(...)]
n29[class JavaScriptAnalysisResult(...)]
n30[__all__ = ['ScanScope', &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n27
n27 --> n28
n28 --> n29
n29 --> n30
n30 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\nAIVA Scan Models - 掃描發現模組\n\n此文件包含與掃描、資產發現...]
n4[from __future__ import annotations]
n5[from datetime import UTC, datetime]
n6[from typing import Any]
n7[from pydantic import BaseModel, Field, HttpUrl, fi...]
n8[from ..aiva_common.enums import AssetType, Confide...]
n9[from ..aiva_common.schemas import Authentication, ...]
n10[class ScanScope(...)]
n11[class ScanStartPayload(...)]
n12[class EnhancedScanScope(...)]
n13[class EnhancedScanRequest(...)]
n14[class Asset(...)]
n15[class TechnicalFingerprint(...)]
n16[class Fingerprints(...)]
n17[class AssetInventoryItem(...)]
n18[class Summary(...)]
n19[class ScanCompletedPayload(...)]
n20[class Vulnerability(...)]
n21[class VulnerabilityDiscovery(...)]
n22[class VulnerabilityLifecyclePayload(...)]
n23[class VulnerabilityUpdatePayload(...)]
n24[class DiscoveredAsset(...)]
n25[class EASMDiscoveryPayload(...)]
n26[class EASMDiscoveryResult(...)]
n27[class EASMAsset(...)]
n28[class AssetLifecyclePayload(...)]
n29[class JavaScriptAnalysisResult(...)]
n30[__all__ = [&#39;ScanScope&#39;, &...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 --> n21
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n25
n25 --> n26
n26 --> n27
n27 --> n28
n28 --> n29
n29 --> n30
n30 --> n2
285. scan context Function init
flowchart TB
n1([開始])
n2([結束])
n3['\n 初始化掃描上下文\n\n Args:\n ...]
n4[self.request = request]
n5[self._start_time = time.time()]
n6[self.assets: list[Asset] = []]
n7[self.urls_found = 0]
n8[self.forms_found = 0]
n9[self.apis_found = 0]
n10[self.pages_crawled = 0]
n11[self.fingerprints: Fingerprints | None = None]
n12[self.errors: list[dict[str, str]] = [...]
n13[logger.debug(f'Scan context initialized f...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 初始化掃描上下文\n\n Args:\n ...]
n4[self.request = request]
n5[self._start_time = time.time()]
n6[self.assets: list[Asset] = []]
n7[self.urls_found = 0]
n8[self.forms_found = 0]
n9[self.apis_found = 0]
n10[self.pages_crawled = 0]
n11[self.fingerprints: Fingerprints | None = None]
n12[self.errors: list[dict[str, str]] = [...]
n13[logger.debug(f&#39;Scan context initialized f...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
286. scan context Function repr
flowchart TB
n1([開始])
n2([結束])
n3['返回上下文的字符串表示']
n4[stats = self.get_statistics(...]
n5[return f"ScanContext(scan_id={self.re...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;返回上下文的字符串表示&#39;]
n4[stats = self.get_statistics(...]
n5[return f&quot;ScanContext(scan_id={self.re...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
287. scan context Function add asset
flowchart TB
n1([開始])
n2([結束])
n3['\n 添加資產到收集列表\n\n Args:\n ...]
n4[self.assets.append(asset)]
n5[logger.debug(f'Asset added: {asset.t...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 添加資產到收集列表\n\n Args:\n ...]
n4[self.assets.append(asset)]
n5[logger.debug(f&#39;Asset added: {asset.t...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
288. scan context Function add error
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄錯誤信息\n\n Args:\n ...]
n4[error_info = {'type': error_...]
n5{if url}
n6[error_info['url'] = url]
n7[]
n8[self.errors.append(error_info)]
n9[logger.warning(f'Error recorded: {er...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄錯誤信息\n\n Args:\n ...]
n4[error_info = {&#39;type&#39;: error_...]
n5{if url}
n6[error_info[&#39;url&#39;] = url]
n7[]
n8[self.errors.append(error_info)]
n9[logger.warning(f&#39;Error recorded: {er...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n7
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n2
289. scan context Function add forms found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的表單計數\n\n Args:\n ...]
n4[self.forms_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的表單計數\n\n Args:\n ...]
n4[self.forms_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
290. scan context Function add js analysis result
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄 JavaScript 分析結果\n\n Args...]
n4{if not hasattr(self, 'js_analy...}
n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
n6[]
n7[self.js_analysis_results.append(result)]
n8[logger.debug(f'JS analysis result recorde...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄 JavaScript 分析結果\n\n Args...]
n4{if not hasattr(self, &#39;js_analy...}
n5[self.js_analysis_results: list[JavaScriptAnalysisR...]
n6[]
n7[self.js_analysis_results.append(result)]
n8[logger.debug(f&#39;JS analysis result recorde...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
291. scan context Function add sensitive match
flowchart TB
n1([開始])
n2([結束])
n3['\n 記錄發現的敏感資料匹配\n\n Args:\n ...]
n4{if not hasattr(self, 'sensitiv...}
n5[self.sensitive_matches: list[SensitiveMatch] = ...]
n6[]
n7[self.sensitive_matches.append(match)]
n8[logger.info(f"Sensitive match recorded: ...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 記錄發現的敏感資料匹配\n\n Args:\n ...]
n4{if not hasattr(self, &#39;sensitiv...}
n5[self.sensitive_matches: list[SensitiveMatch] = &#...]
n6[]
n7[self.sensitive_matches.append(match)]
n8[logger.info(f&quot;Sensitive match recorded: ...]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
292. scan context Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取當前統計信息\n\n Returns:\n ...]
n4[return {'urls_found': self.u...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取當前統計信息\n\n Returns:\n ...]
n4[return {&#39;urls_found&#39;: self.u...]
n1 --> n3
n3 --> n4
n4 --> n2
293. scan context Function increment apis found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的 API 計數\n\n Args:\n ...]
n4[self.apis_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的 API 計數\n\n Args:\n ...]
n4[self.apis_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
294. scan context Function increment pages crawled
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加已爬取頁面計數\n\n Args:\n ...]
n4[self.pages_crawled += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加已爬取頁面計數\n\n Args:\n ...]
n4[self.pages_crawled += count]
n1 --> n3
n3 --> n4
n4 --> n2
295. scan context Function increment urls found
flowchart TB
n1([開始])
n2([結束])
n3['\n 增加發現的 URL 計數\n\n Args:\n ...]
n4[self.urls_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 增加發現的 URL 計數\n\n Args:\n ...]
n4[self.urls_found += count]
n1 --> n3
n3 --> n4
n4 --> n2
296. scan context Function reset statistics
flowchart TB
n1([開始])
n2([結束])
n3['重置所有統計計數器']
n4[self.urls_found = 0]
n5[self.forms_found = 0]
n6[self.apis_found = 0]
n7[self.pages_crawled = 0]
n8[logger.debug('Statistics reset...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置所有統計計數器&#39;]
n4[self.urls_found = 0]
n5[self.forms_found = 0]
n6[self.apis_found = 0]
n7[self.pages_crawled = 0]
n8[logger.debug(&#39;Statistics reset&#3...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n2
297. scan context Function scan duration
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取掃描持續時間(秒)\n\n Returns:\n ...]
n4[return int(time.time() - self._start_...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取掃描持續時間(秒)\n\n Returns:\n ...]
n4[return int(time.time() - self._start_...]
n1 --> n3
n3 --> n4
n4 --> n2
298. scan context Function set fingerprints
flowchart TB
n1([開始])
n2([結束])
n3['\n 設置指紋信息\n\n Args:\n ...]
n4[self.fingerprints = fingerprints]
n5[logger.debug('Fingerprints set...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 設置指紋信息\n\n Args:\n ...]
n4[self.fingerprints = fingerprints]
n5[logger.debug(&#39;Fingerprints set&#3...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
299. scan context Module
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n']
n4[from __future__ import annotations]
n5[import time]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import Asset, Fi...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[pass]
n11[]
n12[logger = get_logger(__name__)]
n13[class ScanContext(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n掃描上下文 - 管理掃描過程中的狀態和數據收集\n&#39;]
n4[from __future__ import annotations]
n5[import time]
n6[from typing import TYPE_CHECKING]
n7[from services.aiva_common.schemas import Asset, Fi...]
n8[from services.aiva_common.utils import get_logger]
n9{if TYPE_CHECKING}
n10[pass]
n11[]
n12[logger = get_logger(__name__)]
n13[class ScanContext(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n2
300. scan orchestrator Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化掃描編排器']
n4[self.static_parser = StaticContentParser(...]
n5[self.fingerprint_collector = FingerprintCollector...]
n6[self.sensitive_detector = SensitiveInfoDetecto...]
n7[self.js_analyzer = JavaScriptSourceAnal...]
n8[self.browser_pool: HeadlessBrowserPool | None = No...]
n9[self.dynamic_extractor: DynamicContentExtractor | ...]
n10[logger.info('ScanOrchestrator initialized...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化掃描編排器&#39;]
n4[self.static_parser = StaticContentParser(...]
n5[self.fingerprint_collector = FingerprintCollector...]
n6[self.sensitive_detector = SensitiveInfoDetecto...]
n7[self.js_analyzer = JavaScriptSourceAnal...]
n8[self.browser_pool: HeadlessBrowserPool | None = No...]
n9[self.dynamic_extractor: DynamicContentExtractor | ...]
n10[logger.info(&#39;ScanOrchestrator initialized...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n2
301. scan orchestrator Function build scan result
flowchart TB
n1([開始])
n2([結束])
n3['\n 構建掃描結果\n\n Args:\n ...]
n4[summary = Summary(urls_found=c...]
n5[return ScanCompletedPayload(scan_id=c...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 構建掃描結果\n\n Args:\n ...]
n4[summary = Summary(urls_found=c...]
n5[return ScanCompletedPayload(scan_id=c...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
302. scan orchestrator Function reset
flowchart TB
n1([開始])
n2([結束])
n3['重置編排器狀態']
n4[self.fingerprint_collector.reset()]
n5[logger.info('ScanOrchestrator reset&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;重置編排器狀態&#39;]
n4[self.fingerprint_collector.reset()]
n5[logger.info(&#39;ScanOrchestrator reset&&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
303. scan orchestrator Module
flowchart TB
n1([開始])
n2([結束])
n3['\n掃描編排器 - 統一管理掃描流程的核心邏輯\n']
n4[from __future__ import annotations]
n5[from typing import TYPE_CHECKING, Any]
n6[from services.aiva_common.schemas import Asset, Sc...]
n7[from services.aiva_common.utils import get_logger,...]
n8[from .authentication_manager import Authentication...]
n9[from .core_crawling_engine.http_client_hi import H...]
n10[from .core_crawling_engine.static_content_parser i...]
n11[from .core_crawling_engine.url_queue_manager impor...]
n12[from .dynamic_engine.dynamic_content_extractor imp...]
n13[from .dynamic_engine.headless_browser_pool import ...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[from .info_gatherer.javascript_source_analyzer imp...]
n17[from .info_gatherer.sensitive_info_detector import...]
n18[from .scan_context import ScanContext]
n19[from .strategy_controller import StrategyControlle...]
n20{if TYPE_CHECKING}
n21[pass]
n22[]
n23[logger = get_logger(__name__)]
n24[class ScanOrchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n掃描編排器 - 統一管理掃描流程的核心邏輯\n&#39;]
n4[from __future__ import annotations]
n5[from typing import TYPE_CHECKING, Any]
n6[from services.aiva_common.schemas import Asset, Sc...]
n7[from services.aiva_common.utils import get_logger,...]
n8[from .authentication_manager import Authentication...]
n9[from .core_crawling_engine.http_client_hi import H...]
n10[from .core_crawling_engine.static_content_parser i...]
n11[from .core_crawling_engine.url_queue_manager impor...]
n12[from .dynamic_engine.dynamic_content_extractor imp...]
n13[from .dynamic_engine.headless_browser_pool import ...]
n14[from .fingerprint_manager import FingerprintCollec...]
n15[from .header_configuration import HeaderConfigurat...]
n16[from .info_gatherer.javascript_source_analyzer imp...]
n17[from .info_gatherer.sensitive_info_detector import...]
n18[from .scan_context import ScanContext]
n19[from .strategy_controller import StrategyControlle...]
n20{if TYPE_CHECKING}
n21[pass]
n22[]
n23[logger = get_logger(__name__)]
n24[class ScanOrchestrator(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n13
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n17
n17 --> n18
n18 --> n19
n19 --> n20
n20 -->|Yes| n21
n20 -->|No| n22
n21 --> n22
n22 --> n23
n23 --> n24
n24 --> n2
304. sensitive data scanner Function init
flowchart TB
n1([開始])
n2([結束])
n3['初始化敏感資料掃描器']
n4[self.compiled_patterns = {name: re.compile(pa...]
n5[self.matches: list[SensitiveMatch] = []]
n6[logger.debug('SensitiveDataScanner initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;初始化敏感資料掃描器&#39;]
n4[self.compiled_patterns = {name: re.compile(pa...]
n5[self.matches: list[SensitiveMatch] = []]
n6[logger.debug(&#39;SensitiveDataScanner initia...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n2
305. sensitive data scanner Function determine severity
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = ['aws_secret_key&...]
n5[high_patterns = ['aws_access_key&#...]
n6[medium_patterns = ['api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return Severity.CRITICAL]
n9{if pattern_type in high_patterns}
n10[return Severity.HIGH]
n11{if pattern_type in medium_patt...}
n12[return Severity.MEDIUM]
n13[return Severity.LOW]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = [&#39;aws_secret_key&...]
n5[high_patterns = [&#39;aws_access_key&#...]
n6[medium_patterns = [&#39;api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return Severity.CRITICAL]
n9{if pattern_type in high_patterns}
n10[return Severity.HIGH]
n11{if pattern_type in medium_patt...}
n12[return Severity.MEDIUM]
n13[return Severity.LOW]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
306. sensitive data scanner Function get context
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取匹配的上下文\n\n Args:\n ...]
n4[context_start = max(0, start - conte...]
n5[context_end = min(len(content), en...]
n6[context = content[context_star...]
n7[match_length = end - start]
n8[match_in_context_start = start - context_star...]
n9[match_in_context_end = match_in_context_sta...]
n10[masked_context = context[:match_in_co...]
n11[return masked_context.replace('\n&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取匹配的上下文\n\n Args:\n ...]
n4[context_start = max(0, start - conte...]
n5[context_end = min(len(content), en...]
n6[context = content[context_star...]
n7[match_length = end - start]
n8[match_in_context_start = start - context_star...]
n9[match_in_context_end = match_in_context_sta...]
n10[masked_context = context[:match_in_co...]
n11[return masked_context.replace(&#39;\n&...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
307. sensitive data scanner Function get severity
flowchart TB
n1([開始])
n2([結束])
n3['\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = ['aws_secret_key&...]
n5[high_patterns = ['aws_access_key&#...]
n6[medium_patterns = ['api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return 'critical']
n9{if pattern_type in high_patterns}
n10[return 'high']
n11{if pattern_type in medium_patt...}
n12[return 'medium']
n13[return 'low']
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 根據模式類型判斷嚴重程度\n\n Args:\n ...]
n4[critical_patterns = [&#39;aws_secret_key&...]
n5[high_patterns = [&#39;aws_access_key&#...]
n6[medium_patterns = [&#39;api_key_generic&&...]
n7{if pattern_type in critical_pa...}
n8[return &#39;critical&#39;]
n9{if pattern_type in high_patterns}
n10[return &#39;high&#39;]
n11{if pattern_type in medium_patt...}
n12[return &#39;medium&#39;]
n13[return &#39;low&#39;]
n14[]
n15[]
n16[]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n9
n8 --> n16
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n15
n11 -->|Yes| n12
n11 -->|No| n13
n12 --> n14
n13 --> n14
n14 --> n15
n15 --> n16
n16 --> n2
308. sensitive data scanner Function mask sensitive value
flowchart TB
n1([開始])
n2([結束])
n3['\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...]
n4{if len(value) <= 8}
n5[return '***']
n6[]
n7[return f'{value[:4]}......]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 遮罩敏感值以避免在日誌中暴露\n\n Args:\n ...]
n4{if len(value) &lt;= 8}
n5[return &#39;***&#39;]
n6[]
n7[return f&#39;{value[:4]}......]
n1 --> n3
n3 --> n4
n4 -->|Yes| n5
n4 -->|No| n6
n5 --> n6
n6 --> n7
n7 --> n2
309. sensitive data scanner Function clear matches
flowchart TB
n1([開始])
n2([結束])
n3['清空所有匹配記錄']
n4[self.matches.clear()]
n5[logger.debug('Cleared all sensitive data ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;清空所有匹配記錄&#39;]
n4[self.matches.clear()]
n5[logger.debug(&#39;Cleared all sensitive data ...]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n2
310. sensitive data scanner Function get all matches
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取所有發現的敏感資料匹配\n\n Returns:\...]
n4[return self.matches.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取所有發現的敏感資料匹配\n\n Returns:\...]
n4[return self.matches.copy()]
n1 --> n3
n3 --> n4
n4 --> n2
311. sensitive data scanner Function get statistics
flowchart TB
n1([開始])
n2([結束])
n3['\n 獲取統計信息\n\n Returns:\n ...]
n4[stats: dict[str, Any] = {'total_...]
n5{for match in self.matches}
n6[stats['by_type'][matc...]
n7[stats['by_severity'][...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 獲取統計信息\n\n Returns:\n ...]
n4[stats: dict[str, Any] = {&#39;total_...]
n5{for match in self.matches}
n6[stats[&#39;by_type&#39;][matc...]
n7[stats[&#39;by_severity&#39;][...]
n8[]
n9[return stats]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n8
n6 --> n7
n7 --> n5
n8 --> n9
n9 --> n2
312. sensitive data scanner Function scan content
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描內容中的敏感資料\n\n Args:\n ...]
n4[matches: list[SensitiveMatch] = []]
n5{for (pattern_name, pattern_regex) in self.compile...}
n6[found_matches = pattern_regex.findit...]
n7{for match in found_matches}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f'Sensitive data found: ...]
n12[]
n13[]
n14{if matches}
n15[logger.info(f'Found {len(matches...]
n16[]
n17[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n7
n12 --> n5
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n17
n17 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 掃描內容中的敏感資料\n\n Args:\n ...]
n4[matches: list[SensitiveMatch] = []]
n5{for (pattern_name, pattern_regex) in self.compile...}
n6[found_matches = pattern_regex.findit...]
n7{for match in found_matches}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f&#39;Sensitive data found: &#...]
n12[]
n13[]
n14{if matches}
n15[logger.info(f&#39;Found {len(matches...]
n16[]
n17[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 -->|Yes| n6
n5 -->|No| n13
n6 --> n7
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n7
n12 --> n5
n13 --> n14
n14 -->|Yes| n15
n14 -->|No| n16
n15 --> n16
n16 --> n17
n17 --> n2
313. sensitive data scanner Function scan headers
flowchart TB
n1([開始])
n2([結束])
n3['\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...]
n4[matches: list[SensitiveMatch] = []]
n5[sensitive_headers = ['authorization&&...]
n6{for (header_name, header_value) in headers.items&...}
n7{if header_name.lower() in sens...}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f'Sensitive header found: ...]
n12[]
n13[]
n14[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n13
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n6
n13 --> n14
n14 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 掃描 HTTP 標頭中的敏感資料\n\n Args:\...]
n4[matches: list[SensitiveMatch] = []]
n5[sensitive_headers = [&#39;authorization&&...]
n6{for (header_name, header_value) in headers.items&...}
n7{if header_name.lower() in sens...}
n8[sensitive_match = SensitiveMatch(match...]
n9[matches.append(sensitive_match)]
n10[self.matches.append(sensitive_match)]
n11[logger.warning(f&#39;Sensitive header found: ...]
n12[]
n13[]
n14[return matches]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 -->|Yes| n7
n6 -->|No| n13
n7 -->|Yes| n8
n7 -->|No| n12
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n12
n12 --> n6
n13 --> n14
n14 --> n2
314. sensitive data scanner Module
flowchart TB
n1([開始])
n2([結束])
n3['\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Severity]
n8[from services.aiva_common.schemas import Sensitive...]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class SensitiveDataScanner(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n敏感資料掃描器\n檢測響應中的敏感資訊(API Keys, Secrets, PII...]
n4[from __future__ import annotations]
n5[import re]
n6[from typing import Any]
n7[from services.aiva_common.enums import Severity]
n8[from services.aiva_common.schemas import Sensitive...]
n9[from services.aiva_common.utils import get_logger,...]
n10[logger = get_logger(__name__)]
n11[class SensitiveDataScanner(...)]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 --> n10
n10 --> n11
n11 --> n2
315. strategy controller Function estimate scan time
flowchart TB
n1([開始])
n2([結束])
n3['\n 估算掃描時間(秒)\n\n Args:\n ...]
n4[params = self._parameters]
n5[pages = min(estimated_pages,...]
n6[time_by_rate = pages / params.reque...]
n7[time_by_timeout = pages * params.reque...]
n8[estimated_time = max(time_by_rate, ti...]
n9{if params.enable_dynamic_scan}
n10[estimated_time *= 1.5]
n11[]
n12[return estimated_time]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;\n 估算掃描時間(秒)\n\n Args:\n ...]
n4[params = self._parameters]
n5[pages = min(estimated_pages,...]
n6[time_by_rate = pages / params.reque...]
n7[time_by_timeout = pages * params.reque...]
n8[estimated_time = max(time_by_rate, ti...]
n9{if params.enable_dynamic_scan}
n10[estimated_time *= 1.5]
n11[]
n12[return estimated_time]
n1 --> n3
n3 --> n4
n4 --> n5
n5 --> n6
n6 --> n7
n7 --> n8
n8 --> n9
n9 -->|Yes| n10
n9 -->|No| n11
n10 --> n11
n11 --> n12
n12 --> n2
316. strategy controller Function is dynamic scan enabled
flowchart TB
n1([開始])
n2([結束])
n3['是否啟用動態掃描']
n4[return self._parameters.enable_dynami...]
n1 --> n3
n3 --> n4
n4 --> n2
flowchart TB
n1([開始])
n2([結束])
n3[&#39;是否啟用動態掃描&#39;]
n4[return self._parameters.enable_dynami...]
n1 --> n3
n3 --> n4
n4 --> n2